Побитовые операции — это операции, работающие с отдельными битами операндов. Операнд должен быть целочисленным, т.е. иметь тип long long, long, unsigned, int, short или char.
Приоритеты побитовых операций приведены в таблице приоритетов (Приоритеты операций).
Поразрядное дополнение (~) – это унарная операция, результатом которой является значение, полученное поразрядным дополнением операнда, т.е. каждый бит со значением 0 заменяется на 1 и наоборот.
Поразрядное умножение И (&) – значением выражения, использующего эту операцию, является поразрядное логические умножение двух операндов.
Исключающее ИЛИ (^) — значением выражения, использующего эту операцию, является поразрядное исключающее ИЛИ ее операндов.
Поразрядное сложение ИЛИ (|) — значением выражения, использующего эту операцию, является поразрядное логические сложение двух операндов.
Знаки этих побитовых операций являются односимвольными. Не путайте их с операциями логического умножения && (И) и логического сложения|| (ИЛИ). Значением выражений, использующих логические операции может быть только истина или ложь. Значением побитовых операций обычно является новое битовое значение.
Сдвиг влево (<<) — значением выражения, использующего эту операцию, является битовое представление левого операнда, сдвинутого влево на число битов, определяемое значением правого операнда.
Сдвиг вправо (>>) — значением выражения, использующего эту операцию, является битовое представление левого операнда, сдвинутого вправо на число битов, определяемое значением правого операнда.
Пример 1
int num1, num2;
num1 = 5;  /* 00101 */
num2 = 11; /* 01011 */
Рис. 1.  Поразрядное И
Рис. 2.  Поразрядное ИЛИ
Рис. 3.  Исключающее ИЛИ
Значением выражения, содержащего операцию поразрядного дополнения, является логическое отрицание значения операнда. Значения битов инвертируются: единицы заменяются нулями, нули – единицами.
Пример 2
num1 = 5;    /* 00101 */
num1             00101
~num1            11010
Операции сдвига << и >>
Целочисленное_выражение << Целочисленное_выражение
Целочисленное_выражение >> Целочисленное_выражение
При сдвиге значения операнда влево биты справа заполняются нулями.
При сдвиге вправо возможны следующие ситуации:
Пример 3
Предположим, что программа выполняется на 8-разрядном компьютере. Первый (старший) разряд является знаковым.
x = x<<2; /* сдвиг значения переменной x влево на 2 бита */
исходное x = 00011000
Результат операции x<<2 есть 01100000.
y >>= 3; /* сдвиг значения переменной y вправо на 3 бита */
исходное y =11011001
Результат операции y>>3 есть 00011011 для логического сдвига и 11111011 для арифметического сдвига.