&= (compound bitwise AND)
Оператор &= — сокращённая форма x = x & y: удобный способ сбросить нужные биты переменной в 0, не затрагивая остальные.
Полная статья
Описание
Составной побитовый оператор AND &= — это сокращённая форма записи x = x & y. Его главная практическая задача — сбросить (обнулить) конкретные биты переменной, оставив все остальные биты нетронутыми. В документации и учебниках эту операцию часто называют «очисткой» или «маскированием» битов.
Принцип работы побитового AND & прост: бит результата равен 1 только тогда, когда оба соответствующих бита операндов равны 1. Если хотя бы один из них равен 0 — результат тоже 0.
0 0 1 1 operand1
0 1 0 1 operand2
----------
0 0 0 1 (operand1 & operand2) - returned result
Синтаксис
x &= y; // equivalent to x = x & y;
Параметры
x: переменная, биты которой нужно изменить. Допустимые типы данных:char,int,long.y: переменная или константа-маска. Допустимые типы данных:char,int,long.
Пример кода
Ключевое правило: бит, объединённый по AND с 0, всегда даёт 0 — то есть сбрасывается. Бит, объединённый по AND с 1, остаётся таким, каким был.
Если myByte — байтовая переменная, то AND с нулём обнулит все биты:
myByte & 0b00000000 = 0;
А AND с единицами оставит все биты без изменений:
myByte & 0b11111111 = myByte;
Примечания и предупреждения
При работе с побитовыми операторами удобно записывать константы-маски в двоичном формате с префиксом 0b — так сразу видно, какие именно биты будут затронуты. В других системах счисления значение то же самое, но читать маску значительно сложнее.
Пример: нужно сбросить биты 0 и 1 переменной, не меняя остальные шесть битов. Для этого составляем маску, в которой позиции 0 и 1 заняты нулями, а остальные — единицами: 0b11111100. Применяем оператор &=:
1 0 1 0 1 0 1 0 variable
1 1 1 1 1 1 0 0 mask
----------------------
1 0 1 0 1 0 0 0
bits unchanged
bits cleared
То же самое, но с явным обозначением «неизвестных» битов переменной символом x:
x x x x x x x x variable
1 1 1 1 1 1 0 0 mask
----------------------
x x x x x x 0 0
bits unchanged
bits cleared
Итого:
myByte = 0b10101010;
myByte &= 0b11111100; // результат 0b10101000
Где применяется
- Управление регистрами микроконтроллера — сброс отдельных флагов конфигурации без изменения остальных настроек.
- Работа с байтами протоколов — выделение или обнуление конкретных полей в байте данных (например, старшего или младшего полубайта).
- Фильтрация значений — ограничение диапазона числа путём обнуления старших битов.
- Управление состоянием — сброс отдельных флагов в переменной-битовом поле, когда несколько логических состояний упакованы в один байт.
Практические замечания
- Маска для
&=должна содержать 0 в тех позициях, которые нужно сбросить, и 1 в тех, которые нужно сохранить — это противоположно интуиции новичков, которые иногда путают маски AND и OR. - Чтобы установить биты (а не сбросить), используют составной оператор
|=с маской, где нужные биты равны 1. - Чтобы инвертировать биты, используют
^=. - Если нужно сбросить только один бит с известным номером
n, удобно записать маску как~(1 << n)— это читается как «все биты, кроме n-го». - Двоичный формат
0b...поддерживается в Arduino IDE и делает маски самодокументируемыми: сразу видно, какие биты затронуты.