if (((number >> i) & 1) == 1)
это мой пример кода.
Как определяется возвращаемое значение в этой операции? Сдвигаем числа вправо или влево. каково возвращаемое значение?
if (((number >> i) & 1) == 1)
См. Побитовая логика , Операторы сдвига и Операторы равенства . В общем: Выражения
Как определяется возвращаемое значение в этой операции?
Нет возвращаемого значения. Есть оператор if с оператором равенства
if (((number >> i) & 1) == 1)
Результатом оператора равенства является значение 0
или 1
типа int
, зависящее от того, являются ли два операнда, ((number >> i) & 1)
и 1
, выражения неравными или равными друг другу соответственно. Если результат равен 1
(операнды равны друг другу), то управление получит подоператор оператора if.
Таким образом, оператор of проверяет, установлен ли бит i-th
в number
в 1 или 0.
number >> i
побитовый сдвиг number
вправо на i
бит:
number i number >> i
------ - -----------
01010101 1 00101010
01010101 2 00010101
01010101 3 00001010
и т. д.
(number >> i) & 1
выполняет побитовое И number >> 1
против 1
:
00101010 (01010101 >> 1)
& 00000001
----------
00000000
00010101 (01010101 >> 2)
& 00000001
----------
00000001
Итак, в основном,
if (((number >> i) & 1) == 1)
разветвится, если установлен младший бит сдвинутого значения.
>>
— это оператор сдвига вправо в языке C.
Результат ((number >> i) & 1)
зависит от трех факторов.
number
либо знаковый, либо беззнаковый.number
, то есть 8*sizeof(число).i
.number
подписан
number
не подписан
Значение i
>= Общий размер в битах number
подписанный бит number
0
Значение i
< общий размер в битах number
i
-й бит number
(младший бит - 0-й бит)
i
-й бит number
(младший бит - 0-й бит)Сдвиг целых чисел со знаком вправо определяется реализацией. Не все реализации сдвигают копии бита знака.
(число >> i) сдвинет вправо число i раз. Тогда «& 1» будет И с 1, что будет либо 1, либо 0. И, наконец, мы проверяем, действительно ли это было 1. Таким образом, весь оператор if проверяет, установлен ли бит i в числе.