Побитовые операции — это операции, работающие с отдельными битами операндов. Операнд должен быть целочисленным, т.е. иметь
тип long long,
long,
unsigned,
int,
short или
char.
Поразрядное дополнение (
~) – это
унарная операция, результатом которой является значение, полученное поразрядным дополнением операнда, т.е. каждый бит со значением 0 заменяется на 1 и наоборот.
Исключающее ИЛИ (
^) — значением выражения, использующего эту операцию, является поразрядное исключающее ИЛИ ее операндов.
Поразрядное сложение ИЛИ (
|) — значением выражения, использующего эту операцию, является поразрядное логические сложение двух операндов.
Знаки этих побитовых операций являются односимвольными. Не путайте их с операциями
логического умножения && (И) и
логического сложения|| (ИЛИ). Значением выражений, использующих логические операции может быть только истина или ложь. Значением побитовых операций обычно является новое битовое значение.
Сдвиг влево (
<<) — значением выражения, использующего эту операцию, является битовое представление левого операнда, сдвинутого влево на число битов, определяемое значением правого операнда.
Сдвиг вправо (
>>) — значением выражения, использующего эту операцию, является битовое представление левого операнда, сдвинутого вправо на число битов, определяемое значением правого операнда.
Пример 1
int num1, num2;
num1 = 5; /* 00101 */
num2 = 11; /* 01011 */
Значением выражения, содержащего операцию поразрядного дополнения, является логическое отрицание значения операнда. Значения битов инвертируются: единицы заменяются нулями, нули – единицами.
Пример 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 для арифметического сдвига.