Битовая маска и сравнение в Python

Битовая маска и сравнение в Python

@python_quiz

Разберем этот квиз

Условие (исходный фрагмент кода):

python

Код небольшой, но важен для понимания приоритетов операций и того, как работают битовые маски. Ниже — пошаговый разбор, разъяснение всех вариантов ответа и несколько примеров.

Что делает этот код — пошагово

  1. Объявляются две переменные в виде двоичных литералов:

- flags = 0b0101 (в десятичном это 5)
- mask = 0b0010 (в десятичном это 2)

  1. Выполняется побитовое И: flags & mask.
  2. Сравнивается результат побитового И с mask: (flags & mask) == mask.
  3. В зависимости от результата сравнения печатается 'ON' или 'OFF'.

Важный момент: побитовое И (&) вычисляется до операции сравнения (==), поэтому выражение верно интерпретировано как (flags & mask) == mask.

Вычисление битов

Выполним побитовое И вручную:

  • 0b0101
  • & 0b0010
  • = 0b0000

0b0000 равно 0 (в десятичной) и не равно mask (0b0010 = 2). Следовательно, условие ложно и печатается 'OFF'.

Можно подтвердить запуском:

python

Анализ вариантов ответов

  • "Выведет: ON"

Это произошло бы, если результат (flags & mask) совпал бы с mask (то есть если все биты mask присутствуют в flags). В текущих значениях это не так.

  • "Выведет: OFF"

Соответствует тому, что происходит при данных значениях flags и mask — печатается 'OFF', потому что (flags & mask) == 0, а mask == 2.

  • "Произойдёт ошибка TypeError"

TypeError мог бы возникнуть, если бы использовались несовместимые типы (например, попытка применить & к объектам, для которых операция не определена). Здесь оба операнда — целые числа, операция корректна, ошибок не будет.

  • "Произойдёт ошибка SyntaxError"

SyntaxError возникает при неверном синтаксисе кода. Приведённый фрагмент — корректный Python-код, синтаксических ошибок нет.

Дополнительный пример — когда будет 'ON'

Если вы хотите, чтобы условие сработало как "ON", flags должен содержать все биты mask. Пример:

python

Здесь 0b0110 & 0b0010 = 0b0010, что равно mask, поэтому печатается 'ON'.

Короткие выводы и советы

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

Report Page