Раз бит — это либо 0, либо 1, к числам можно применять побитовые логические операции:
- НЕ (~)
- И (&)
- ИЛИ (|)
- Исключающее ИЛИ (^)
Кроме того, есть операции сдвига: << и >>.
Инверсия (~)
Операция инверсии заменяет все 0 на 1 и все 1 на 0.
number = 5
print(~number) # -6 Почему так?
- Число 5 в двоичной форме (в 8 битах): 00000101.
- Инверсия даёт: 11111010.
- Это представление числа -6 в дополнительном коде.
Важно: отрицательные числа в памяти компьютера хранятся именно в дополнительном коде.
Конъюнкция (&)
Операция И: результат равен 1 только если оба соответствующих бита равны 1.
Пример:
print(5 & 4) # 4
print(6 & 10) # 2 Дизъюнкция (|) и XOR (^)
Работают так же побитово:
- ИЛИ (|) → результат равен 1, если хотя бы один из битов равен 1.
- Исключающее ИЛИ (^) → результат равен 1, если биты разные.
Пример:
print(5 | 3) # 7
print(5 ^ 3) # 6 Важно не путать побитовые и логические операции.
- Побитовые: & | ^ ~ << >>
- Логические: and or not
Сдвиги (<< и >>)
Сдвиги позволяют двигать двоичное представление числа:
- << n — сдвиг влево на n бит.
- >> n — сдвиг вправо на n бит.
print(5 << 2) # 20
print(29 >> 3) # 3 Свойства сдвигов
- Сдвиг влево на 1 бит → умножение на 2.
- Сдвиг вправо на 1 бит → целочисленное деление на 2.
print(7 << 1) # 14
print(7 >> 1) # 3 Быстрый способ вычислить 2ⁿ
Если сдвинуть 1 влево на n позиций, получаем число 2^n.
print(1 << 5) # 32 Таким образом, битовые операции позволяют:
- работать с числами на уровне двоичных представлений;
- быстро умножать/делить на степени двойки;
- проверять и изменять отдельные биты;
- эффективно хранить и обрабатывать множества (через битовые маски).
