int get_int_with_every_fourth_bit_set()
{
return 0x88888888;
}
Хорошо, это было в основном шутливо.Вот список того, что делают побитовые операторы:
- поразрядно NOT (
~
): переключение битов, от 0 до 1 и от 1 до 0 - AND (
&
): Установить бит, если бит в этой позиции установлен в обоих операндах - ИЛИ (
|
): установить бит, если бит в этой позиции установлен в любом операнде - XOR (
^
): установите бит, если между двумя операндами установлен ровно один бит в этой позиции. - Битовый сдвиг (
<<
и >>
): перемещение каждого бита на указанное значение в заданном направлении.,При смещении влево нули добавляются к младшему значащему биту.При смещении вправо добавляется ноль, если значение является беззнаковым или положительным.
Вот некоторые побитовые уловки, которые полезно знать:
Битовое смещение влево на единицу равнозначно умножению на два.Битовый сдвиг вправо на единицу - это то же самое, что деление на два и округление вниз.
Все полномочия двух имеют ровно один 1 бит.Чтобы увидеть, является ли число степенью двойки, вы можете сделать это:
return !(x & (x - 1)) && x
В качестве примера, скажем, x = 16
, что является степенью двойки.Затем x - 1 = 15
, поэтому значения, которые должны быть ANDed, равны 00010000
и 00001111
.Поскольку каждая битовая позиция имеет ноль по крайней мере в одном из двух операндов, результат равен нулю.!0
верно, поэтому проверьте, если x != 0
.Начиная с 16 != 0
, оператор возвращает true.Если вы попробуете это с числом, которое не является степенью двойки и не равно нулю, то проверка x & (x - 1)
всегда будет верна.Так круто!
Еще один совет: начиная с 0 ^ 0 = 0
и 1 ^ 1 = 0
, вы можете использовать XOR, чтобы увидеть, какие биты изменились.Например, если у вас есть два байта и вы хотите увидеть биты, которые изменились между ними, XOR двух байтов даст вам 1 в позиции всех битов, которые изменились.