C++ | Помогите понять побитовые операторы

Есть такой код:

#define TEST (1<<0)
a &= ~TEST

Он равносилен этому?

a = a & (0<<1)

Или как?


Ответы (2 шт):

Автор решения: Harry
#define TEST (1<<0)
a &= ~TEST

Разбираем...

a = a & ~TEST

Но: TEST - это просто сдвиг единичного бита на 0 разрядов, или просто 1.

a = a & ~1 

т.е.

a = a & 11...1110

Второй же оператор -

a = a & (0<<1)

В нем 0 << 1 - это сдвиг 0 на 1 разряд влево, т.е. просто 0:

a = a & 0 

Или просто

a = 0
→ Ссылка
Автор решения: becouse

Побитовые операторы работают с двоичным представлением числа.

Обычное И && это результат конъюнкции двух логических выражений.

Побитовое И & это применение логической операции «поразрядно» к соответствующим битам числа.

Пример. x = 52, y = 21, 52 = 110100, 21 = 10101, 52 & 21 = 20

1 1 0 1 0 0
0 1 0 1 0 1
-----------
0 1 0 1 0 0

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

n<<1 эквивалентно умножению на 2. Все биты сдвигаются на 1 позицию влево, крайний левый бит отбрасывается. Крайний правый заменяется на 0.

n>>1 эквивалентно целой части от деления на 2. Все биты сдвигаются на 1 позицию вправо, крайний правый бит отбрасывается. Крайний левый заменяется на 0.

a &= ~TEST

равносильно

a = a & (TEST)
a = a & ~(1<<0)
→ Ссылка