Битовая маска и сравнение в Python
@python_quizРазберем этот квиз
Условие (исходный фрагмент кода):

Код небольшой, но важен для понимания приоритетов операций и того, как работают битовые маски. Ниже — пошаговый разбор, разъяснение всех вариантов ответа и несколько примеров.
Что делает этот код — пошагово
- Объявляются две переменные в виде двоичных литералов:
- flags = 0b0101 (в десятичном это 5)
- mask = 0b0010 (в десятичном это 2)
- Выполняется побитовое И: flags & mask.
- Сравнивается результат побитового И с mask: (flags & mask) == mask.
- В зависимости от результата сравнения печатается 'ON' или 'OFF'.
Важный момент: побитовое И (&) вычисляется до операции сравнения (==), поэтому выражение верно интерпретировано как (flags & mask) == mask.
Вычисление битов
Выполним побитовое И вручную:
- 0b0101
- & 0b0010
- = 0b0000
0b0000 равно 0 (в десятичной) и не равно mask (0b0010 = 2). Следовательно, условие ложно и печатается 'OFF'.
Можно подтвердить запуском:

Анализ вариантов ответов
- "Выведет: ON"
Это произошло бы, если результат (flags & mask) совпал бы с mask (то есть если все биты mask присутствуют в flags). В текущих значениях это не так.
- "Выведет: OFF"
Соответствует тому, что происходит при данных значениях flags и mask — печатается 'OFF', потому что (flags & mask) == 0, а mask == 2.
- "Произойдёт ошибка
TypeError"
TypeError мог бы возникнуть, если бы использовались несовместимые типы (например, попытка применить & к объектам, для которых операция не определена). Здесь оба операнда — целые числа, операция корректна, ошибок не будет.
- "Произойдёт ошибка
SyntaxError"
SyntaxError возникает при неверном синтаксисе кода. Приведённый фрагмент — корректный Python-код, синтаксических ошибок нет.
Дополнительный пример — когда будет 'ON'
Если вы хотите, чтобы условие сработало как "ON", flags должен содержать все биты mask. Пример:

Здесь 0b0110 & 0b0010 = 0b0010, что равно mask, поэтому печатается 'ON'.
Короткие выводы и советы
- Побитовые операции (&, |, ^) применяются к целым числам и имеют приоритет, достаточный для того, чтобы частые выражения вида flags & mask == mask интерпретировались как (flags & mask) == mask.
- Для читаемости и безопасности можно явно ставить скобки, как в примере.
- Используйте двоичные литералы 0b... для удобной работы с масками.
TypeError/SyntaxErrorв таком коде маловероятны — только при нарушении типов или синтаксиса соответственно.