1. Побитовый оператор AND

Когда-то мы говорили, что все данные хранятся в памяти в двоичной системе. Поэтому довольно давно программисты придумали много чего интересного для работы с двоичным представлением чисел. Например, в Java есть логические операторы, которые работают с битами чисел: AND (И), OR (ИЛИ), NOT (НЕ) и XOR (исключающее или).

a & b
Побитовый оператор AND (И)

Данный оператор очень похож на логический оператор AND (И), только обозначается не двумя амперсандами, а одним:

И применяется он не к числу в целом, а к его битам: число рассматривается как массив бит, и i-й бит числа-результата вычисляется на основе i-х бит каждого из двух чисел.

Первый бит результата будет вычисляться на основе первого бита числа a и первого бита числа b, второй бит — на основе второго бита числа a и второго бита числа b, и т.д.

Ну а оператор AND (И) означает, что «результирующий бит равен единице, только если бит числа a равен единице И бит числа b равен единице»:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

Примеры:

Пример Результат
0b0011 & 0b1010
0b0010
0b1111 & 0b0000
0b0000
0b1010 & 0b0101
0b0000
0b1111 & 0b1010
0b1010

2. Побитовый оператор OR

Данный оператор очень похож на логический оператор OR (ИЛИ), только обозначается уже не двумя вертикальными линиями, а одной:

a | b

Также он применяется не к числу в целом, а к его битам: i-й бит числа-результата вычисляется на основе i-х бит каждого из двух чисел.

Побитовый OR (ИЛИ) означает, что «результирующий бит равен единице если бит числа a равен единице ИЛИ бит числа b равен единице»:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

Примеры:

Пример Результат
0b0011 | 0b1010
0b1011
0b1110 | 0b0000
0b1110
0b1010 | 0b0101
0b1111
0b1111 | 0b1010
0b1111

Только когда биты обоих чисел (стоящие на одинаковых позициях) равны нулю, соответствующий бит результата равен нулю.



3. Побитовый оператор XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ)

Оператор XOR, его еще называют исключающее или, обозначается символом ^. Чтобы ввести его на клавиатуре, нужно нажать shift+6 (в английской раскладке).

a ^ b

Данный оператор чем-то похож на оператор OR, (он даже называется похоже — XOR)

Побитовый XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) означает, что «результирующий бит равен единице, если бит числа a равен единице ИЛИ бит числа b равен единице, но не оба одновременно»:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

Примеры:

Пример Результат
0b0011 ^ 0b1010
0b1001
0b1110 ^ 0b0000
0b1110
0b1010 ^ 0b0101
0b1111
0b1111 ^ 0b1010
0b0101

Только когда биты обоих чисел (стоящие на одинаковых позициях) разные, соответствующий бит результата равен единице. Если биты одинаковые, результирующий бит равен нулю.



4. Побитовый оператор NOT (НЕ, ОТРИЦАНИЕ)

Думаю, вы уже догадываетесь, что он означает. Данный оператор очень похож на логический оператор NOT (НЕ), только обозначается уже не восклицательным знаком, а тильдой:

~a

Этот оператор унарный: применяется не к двум числам, а к одному, перед которым и ставится.

Побитовый NOT означает, что «результирующий бит равен единице, если бит числа a равен нулю, и равен нулю, если бит числа a равен единице»:

~1 = 0
~0 = 1

Примеры:

Пример Результат
~0b0011
0b1100
~0b0000
0b1111
~0b0101
0b1010
~0b1111
0b0000

Данный оператор просто меняет бит 1 на 0 и 0 на 1.