Примеры битовых операций в С++

В С++ есть 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
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
Для положительных чисел битовый сдвиг числа вправо на n равносилен целочисленному делению на 2n. Аналогично, битовый сдвиг влево на n бит равносилен (для положительных чисел) умножению на 2n и осуществляется при помощи оператора <<.

Последнее изменение: вторник, 8 сентября 2020, 12:54