Главная chevron_right Структура chevron_right Составные операторы chevron_right &= (compound bitwise AND)

&= (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 и делает маски самодокументируемыми: сразу видно, какие биты затронуты.

Полезные материалы