В дополнение к ответу «dasblinkenlight» я думаю, что может помочь пример. Я буду использовать только 8 бит для лучшего понимания.
x & 1
производит значение, которое может быть либо 1
, либо 0
, в зависимости от младшего бита x
: если последний бит равен 1
, результатом x & 1
будет 1
; в противном случае это 0
. Это побитовая операция И.
Это потому, что 1
будет представлен в битах как 00000001
. Только последний бит установлен в 1
. Предположим, что x
равно 185
, который будет представлен в битах как 10111001
. Если вы примените побитовую операцию И к x
с 1
, результатом будет:
00000001
10111001
--------
00000001
Первые семь бит результата операции будут 0
после операции и не будут нести никакой информации в этом случае (см. Операция логического И). Потому что какими бы ни были первые семь бит операнда x
, после операции они будут 0
. Но последний бит операнда 1
равен 1
, и он покажет, был ли последний бит операнда x
0
или 1
. Итак, в этом примере результатом побитовой операции И будет 1
, потому что наш последний бит x
равен 1
. Если бы последним битом было 0
, то результат был бы также 0
, указывая, что последний бит операнда x
равен 0
:
00000001
10111000
--------
00000000
x >>= 1
означает «установить x
на себя со смещением на один бит вправо». Выражение оценивается как новое значение x
после сдвига.
Возьмем пример сверху. Для x >>= 1
это будет:
10111001
--------
01011100
А для сдвига влево x <<= 1
это будет:
10111001
--------
01110010
Обратите внимание на примечание пользователя dasblinkenlight относительно смен.
person
stackomatiker
schedule
23.02.2018
&
,>>=
и других операторов, как известно, сложно искать в Интернете. Вопрос прост для тех, кто видел этих операторов раньше, но они не говорят сами за себя и могут быть довольно сложными, когда вы видите их впервые. - person Sergey Kalinichenko   schedule 12.08.2016sizeof
предполагает, чтоsizeof x * CHAR_BIT
даст правильный ответ. Но код в вопросе измеряет только количество значимых битов в конкретном аргументе (то есть не считает нулевые биты перед первым 1-битом). Это разные вещи. - person M.M   schedule 03.01.2017-1
вам, вероятно, следует использовать~0U
, чтобы установить все биты в 1. - person Eljay   schedule 07.03.2018