Поразрядные операторы

В языках C и C++ реализованы операторы, которые выполняют действия над битами. Поразрядные операторы можно использовать только с целыми типами.

Оператор      Значение
& И
| ИЛИ
^ Исключающее ИЛИ
~ Дополнение до 1
>> Сдвиг вправо
<< Сдвиг в лево

Операторы &, | и ^

Таблица истиности для операторов &, | и ^ имеет следующий вид.

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

При выполнении этих поразрядных операций эти правила применяються к каждому биту каждоко оператора. Например.

$ | ^
 0 1 0 1 1 1 0 1 
 0 0 1 1 1 0 1 1 

 0 0 0 0 1 0 0 1 
 0 1 0 0 1 1 0 1 
 0 0 1 1 1 0 1 1 

 0 1 1 1 1 1 1 1 
 0 1 0 0 1 1 0 1 
 0 0 1 1 1 0 1 1 

 0 1 1 1 0 1 1 0 

Оператор дополнения до еденицы

Оператор дополнения до еденицы, ~, будет инвентировать все биты операнда. Например если ch имеет двоичный код
0 0 1 1 1 0 0 1 ,
то после выполнения оператора
ch = ~ch;
двоичный код переменной ch будет иметь вид
1 1 0 0 0 1 1 0 .

Операторы сдвига

Операторы сдвига вправо (>>) и влево (<<) сдвигают все биты целого значения на заданое число разрядов. Их формат следующий.

Копировать
значение >> количество
значение << количество

Здесь количество означает количество позиций, на которое будет сдвинуто значение.

Если двоичный код значения (в предаоложени, что оно не имеет знака) равен
0 0 1 1 1 1 0 1,
то после сдвига вправо получим
0 0 0 1 1 1 1 0,
а после сдвига влево результатом будет
0 1 1 1 1 0 1 0

Поразрядные сдвиги эквивалентны умножению и делению на 2, и выполняються быстрее чем обычное умножение и деление на 2.

Далее показан приоритет поразрядных операторов.

Приоритет      Операторы
Наивасший ~
>> <<
&
^
Низший |