Числа могут быть выражены в двоичном виде следующим образом:
3 = 000011
5 = 000101
10 = 001010
... и т. Д.Я собираюсь предположить, что вы знакомы с двоичным.
Побитовое И означает взять два числа, выстроить их друг в друга и создать новое число, которое имеет 1, где оба числа имеют1 (все остальное - 0).
Например:
3 => 00011
& 5 => 00101
------ -------
1 00001
Побитовое ИЛИ означает взять два числа, выстроить их в ряд друг над другом и создать новый номер, имеющий1, где любое число имеет 1 (все остальное 0).
Например:
3 => 00011
| 5 => 00101
------ -------
7 00111
Побитовое XOR (исключающее ИЛИ) означает взять два числа, выстроить их друг в друга и создать новое число, которое имеет 1, где либочисло имеет 1, а другое число имеет 0 (все остальное - 0).
Например:
3 => 00011
^ 5 => 00101
------ -------
6 00110
Побитовое значение NOR (не ИЛИ) означает получение побитового ИЛИ двухчисла, а затем все наоборот (где был 0, теперь 1, где был 1, теперь 0).
Побитовое NAND (не И) означает взять побитовое И двухчисла, а затем все наоборот (где был 0, теперь 1, где был 1, теперь 0).
Продолжение: почему word &= 15
устанавливает все, кроме 4 самых правых битовдо 0?Вы должны быть в состоянии понять это сейчас ...
n => abcdefghjikl
& 15 => 000000001111
------ --------------
? 00000000jikl
(0 AND a = 0
, 0 AND b = 0
, ... j AND 1 = j
, i AND 1 = i
, ...)
Как это полезно?Во многих языках мы используем вещи, называемые «битовые маски».Битовая маска - это, по сути, число, представляющее целую кучу меньших чисел, объединенных вместеМы можем объединить числа, используя OR, и разделить их, используя AND.Например:
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
Если у меня есть только карта и шляпа, я могу выразить это как myInventoryBitmask = (MagicMap | MagicHat)
, и результатом будет моя битовая маска.Если у меня ничего нет, тогда моя битовая маска равна 0. Если я хочу посмотреть, есть ли у меня моя палочка, я могу сделать:
int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
printf("I have a wand\n");
} else {
printf("I don't have a wand\n");
}
Получить?
РЕДАКТИРОВАТЬ:больше вещей
Вы также столкнетесь с оператором "bithift": << и >>.Это просто означает «сдвинуть все влево на n битов» или «сдвинуть все влево на n битов».
Другими словами:
1 << 3
= 0001 << 3
= 0001000
= 8
А:
8 >> 2
= 01000 >> 2
= 010
= 2