Побитовые операции

от
Java

В языке Java (да и в других языках тоже) есть такие побитовые операции:
И (AND) &
ИЛИ (OR) |
ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) ^
СДВИГ ВЛЕВО (SHL) <<
СДВИГ ВПРАВО (SHR) >>
ИНВЕРСИЯ ~

И (конъюнкция)
  1. a b  &
  2. 0 0  0
  3. 0 1  0
  4. 1 0  0
  5. 1 1  1
Правило: если хотя бы в одном из битов будет ноль, то результат тоже будет нулём.

Возьмём числа 34 и 27. В двоичной системе счисления им будут соответствовать числа 00100010 и 00011011.
Выполним операцию И для этих двух чисел:
00100010 - 34
00011011 - 27
00000010 - 2
То есть 34 & 27 = 2

ИЛИ (дизъюнкция)
  1. a b  |
  2. 0 0  0
  3. 0 1  1
  4. 1 0  1
  5. 1 1  1
Правило: если хотя бы в одном из битов будет единица, то результат тоже будет единицей.

Выполним операцию ИЛИ для всё тех же чисел 34 и 27.
00100010 - 34
00011011 - 27
00111011 - 59

ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2)
  1. a b  ^
  2. 0 0  0
  3. 0 1  1
  4. 1 0  1
  5. 1 1  0
Правило: если биты отличаются, то результат - единица, если одинаковы - ноль.

Пример:
00100010 - 34
00011011 - 27
00111001 - 57

У исключающего или есть одно интересное свойство - если применить операцию дважды с одним и тем же вторым операндом b, то в результате получится исходное число a: (a ^ b) ^ b = a.
00111001 - 57
00011011 - 27
00100010 - 34

ПОБИТОВЫЙ СДВИГ ВЛЕВО
Сдвигает биты на указанное число разрядов влево. Биты слева исчезают, а справа заполняются нулями.

Пример 34 << 3:
00100010 - 34
00010000 - 16

ПОБИТОВЫЙ СДВИГ ВПРАВО
Сдвигает биты на указанное число разрядов вправо. Биты справа исчезают, а слева заполняются нулями.

Пример 34 >> 3:
00100010 - 34
00000100 - 4

ИНВЕРСИЯ
Инвертирует бит. Ноль становится единицей, а единица нулём.

Пример ~34:
00100010 - 34
11011101 - 221


Общая таблица
  1. a b  &  |  ^
  2. 0 0  0  0  0
  3. 0 1  0  1  1
  4. 1 0  0  1  1
  5. 1 1  1  1  0


С помощью этих операций можно оперировать битами в числах.
Установка (значение x-ого слева бита будет равно 1): number |= 1 << x;
Очистка (значение x-ого слева бита будет равно 0): number &= ~(1 << x);
Переключение (0 меняется на 1, 1 на 0): number ^= 1 << x;
Проверка состояния бита: boolean enable = (number & (1 << x)) != 0;
+6   6   0
1387