Побитовые операции для целых типов
Примеры битовых операций в С++
В С++ есть 6 побитовых операторов:
Оператор | Символ | Пример | Операция |
Побитовый сдвиг влево | << | x << y | Все биты в x смещаются влево на y бит |
Побитовый сдвиг вправо | >> | x >> y | Все биты в x смещаются вправо на y бит |
Побитовое НЕ | ~ | ~x | Все биты в x меняются на противоположные |
Побитовое И | & | x & y | Каждый бит в x И каждый бит в y |
Побитовое ИЛИ | | | x | y | Каждый бит в x ИЛИ каждый бит в y |
Побитовое исключающее ИЛИ (XOR) | ^ | x ^ y | Каждый бит в x XOR каждый бит в y |
Рассмотрим их использование на примерах.
ЗАМЕЧАНИЕ: здесь и далее в примерах используются 8-битные числа для упрощения записи. Всё это верно и для любых других чисел.
Побитовое И (&)
Побитовое И действует на позиции каждого бита, окружающих выражения независимо от того какой из операндов стоит первым, а какой вторым. В соответствии с правилом: если оба входных бита равны 1, результирующий выходной сигнал равен 1, в противном случае выход равен 0
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bit Operation of 12 and 25 00001100 & 00011001 ________ 00001000 = 8 (In decimal)
int a = 12, b = 25;int
c = a & b; //
8
Побитовое ИЛИ (|)
Как и оператор &, оператор | работает независимо с каждым битом окружающиъ его чисел. Результат операции побитового ИЛИ двух бит будет 1, если хотя бы один из этих битов 1, иначе резульат будет 0.
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise OR Operation of 12 and 25 00001100 | 00011001 ________ 00011101 = 29 (In decimal)
int a = 12, b = 25;
int c = a | b; // 29
Побитовое XOR или исключающее ИЛИ (^)
Исключающее ИЛИ ^ или как его называют, XOR устанавливает бит, если соответствующие биты в операндах отличаются.
12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise XOR Operation of 12 and 25 00001100 | 00011001 ________ 00010101 = 21 (In decimal)
int a = 12, b = 25;
int c = a ^ b; // 21
Побитовое отрицание
~ - побитовое отрицание работает следующим образом: каждый бит числа изменяет свое состояние на противоположное, то есть ноль становится единицей, а единица нулем.35 = 00100011 (In Binary) Bitwise complement Operation of 35 ~ 00100011 ________ 11011100 = 220 (In decimal)
int a=35;
int c=~a; // 220
Операторы сдвига
Операторы сдвига >> и << сдвигают биты в переменной вправо и влево на указанное число.
Оператор a>>n
возвращает число, которое получается из a
сдвигом всех бит на n
позиций вправо, при этом самые правые n
бит отбрасываются.
int a = 43 ; // 00101011Для положительных чисел битовый сдвиг числа вправо на n равносилен целочисленному делению на 2n. Аналогично, битовый сдвиг влево на n бит равносилен (для положительных чисел) умножению на 2n и осуществляется при помощи оператора <<.
int b = a >> 1 ; // 00010101 == 21
int c = a >> 2 ; // 00001010 == 10
int a = 5 ; // 00000101
int b = a << 1 ; // 00001010 == 10
int c = a << 2 ; // 00010100 == 20
int d = 2 << 3 ; // 00101000 == 40