Битовые операторы — это мощный инструмент в Python для низкоуровневых манипуляций с данными. Они работают не с числами как таковыми, а с их двоичным представлением, то есть с последовательностью нулей и единиц. Это позволяет очень эффективно решать специфические задачи: управлять флагами настроек в одном-единственном числе, работать с сетевыми протоколами, шифровать данные или просто выполнять некоторые математические операции быстрее, чем их "аналоги". В этом тренажере мы начнем с основ: познакомимся с самими операторами, научимся предсказывать их результат, а затем перейдем к практическим примерам, где битовые операции помогают элегантно решать задачи по установке, проверке или инвертированию конкретных битов. Задания построены так, чтобы вы постепенно погружались в тему, начиная с простого сопоставления и заканчивая сборкой полноценного кода.
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Результат операции AND (&)
Оператор `&` (побитовое И) возвращает 1 для каждого бита, если этот бит равен 1 в обоих числах. Проанализируйте код и выберите, какой результат он выведет. Число 9 в двоичной системе это 1001, а число 5 — 0101.
a = 9 # 1001 в двоичной системе
b = 5 # 0101 в двоичной системе
result = a & b
print(result)Результат операции OR (|)
Теперь посмотрим на оператор `|` (побитовое ИЛИ). Он возвращает 1, если бит равен 1 хотя бы в одном из чисел. Что выведет код на экран? Число 10 в двоичной системе — 1010, а 6 — 0110.
x = 10 # 1010
y = 6 # 0110
print(x | y)Результат операции XOR (^)
Оператор `^` (исключающее ИЛИ) ставит 1 только в том случае, если биты в операндах разные. Какой результат вернет данный код? Введите ответ в виде числа. (12 это 1100, 9 это 1001).
val1 = 12 # 1100
val2 = 9 # 1001
result = val1 ^ val2
print(result)Инверсия битов (~)
Унарный оператор `~` (побитовое НЕ) инвертирует все биты числа. В Python это работает по правилу `~x = -x - 1` для целых чисел. Какой результат выведет код? Введите число (возможно, отрицательное).
number = 15
inverted_number = ~number
print(inverted_number)Операция сдвига
Операторы сдвига `<<` (влево) и `>>` (вправо) сдвигают биты числа, что эквивалентно быстрому умножению или делению на степень двойки. Вставьте пропущенный оператор и число, чтобы получить верный результат.
# Умножение на 4
res1 = 7 input1S 2 # Должно получиться 28
# Целочисленное деление на 8
res2 = 40 input2S 3 # Должно получиться 5
print(f"Результаты: {res1}, {res2}")Исправьте ошибку в маске
Часто битовые операции используют для проверки флагов. В этом коде мы хотим проверить, установлен ли третий бит (который имеет значение 4) в числе `permissions`. В коде допущена ошибка в логике проверки. Найдите и исправьте её.
permissions = 13 # 1101 в двоичной системеREAD_PERMISSION = 4 # 0100 в двоичной системе # Проверяем, есть ли право на чтениеif permissions + READ_PERMISSION: print("Право на чтение есть.")else: print("Права на чтение нет.")Соберите код для установки бита
Соберите из фрагментов работающий код. Цель: установить второй бит (значение 2) в переменной `config`. Изначально `config` равен 8 (1000). После установки бита значение должно стать 10 (1010). Одна из строк лишняя.
config = 8print(config)config = config | MASK_BIT_2MASK_BIT_2 = 2config = config & MASK_BIT_2Инвертирование бита с помощью XOR
Операция `XOR` (`^`) идеально подходит для инвертирования бита: если бит был 0, он станет 1, а если был 1 — станет 0. Перетащите элементы из банка, чтобы собрать код, который инвертирует четвертый бит (значение 8) в числе `state`.
state = 13 # 1101
TOGGLE_MASK = input1S
# Инвертируем четвертый бит
state = input2S input3S TOGGLE_MASK
print(state) # Должно получиться 5 (0101)