Python - Битовые операторы

Привет, будущие волшебники Python! Сегодня мы отправляемся в захватывающее путешествие в мир битовых операторов. Я знаю, что вы можете подумать: "Битовые операторы? Это как-то только компьютерщики заботятся!" Но поверьте мне, понимание этих операторов может быть чрезвычайно полезным и даже веселым! Давайте погружемся и раскроем тайны битов и байтов вместе.

Python - Bitwise Operators

Битовые операторы Python

Битовые операторы — это специальные операторы, которые работают с двоичными представлениями чисел. Они манипулируют отдельными битами, которые являются самыми маленькими единицами данных в вычислительной технике. Представьте биты как маленькие переключатели, которые могут быть включены (1) или выключены (0).

Перед тем как погружаться в каждый оператор, давайте быстро рассмотрим все битовые операторы, доступные в Python:

Оператор Название Описание
& И Устанавливает каждый бит в 1, если оба бита равны 1
| ИЛИ Устанавливает каждый бит в 1, если один из двух битов равен 1
^ Исключающее ИЛИ Устанавливает каждый бит в 1, если только один из двух битов равен 1
~ НЕ Инвертирует все биты
<< Сдвиг влево Сдвигает влево, подталкивая нули справа
>> Сдвиг вправо Сдвигает вправо, подталкивая копии самого левого бита слева

Теперь давайте рассмотрим каждый из этих операторов подробнее.

Оператор Битового И (И) в Python (&)

Оператор Битового И (&) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если оба бита равны 1, соответствующий бит результата устанавливается в 1. В противном случае соответствующий бит результата устанавливается в 0.

Посмотрим на пример:

a = 5  # двоично: 0101
b = 3  # двоично: 0011
result = a & b
print(f"{a} & {b} = {result}")  # Вывод: 5 & 3 = 1

В этом примере мы выполняем битовое И между 5 (0101 в двоичной системе) и 3 (0011 в двоичной системе). Результат — 1 (0001 в двоичной системе).

Вот как это работает:

0101 (5)
& 0011 (3)
----
0001 (1)

Как видите, только правый бит равен 1 в обоих числах, поэтому только этот бит равен 1 в результате.

Оператор Битового ИЛИ (ИЛИ) в Python (|)

Оператор Битового ИЛИ (|) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если любой бит равен 1, соответствующий бит результата устанавливается в 1. В противном случае соответствующий бит результата устанавливается в 0.

Вот пример:

a = 5  # двоично: 0101
b = 3  # двоично: 0011
result = a | b
print(f"{a} | {b} = {result}")  # Вывод: 5 | 3 = 7

В этом случае мы выполняем битовое ИЛИ между 5 и 3. Результат — 7 (0111 в двоичной системе).

Вот что происходит:

0101 (5)
| 0011 (3)
----
0111 (7)

Результат имеет 1 где был 1 в любом из исходных чисел.

Оператор Битового Исключающего ИЛИ (Исключающее ИЛИ) в Python (^)

Оператор Битового Исключающего ИЛИ (^) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если биты различны, соответствующий бит результата устанавливается в 1. Если биты одинаковы, соответствующий бит результата устанавливается в 0.

Посмотрим на пример:

a = 5  # двоично: 0101
b = 3  # двоично: 0011
result = a ^ b
print(f"{a} ^ {b} = {result}")  # Вывод: 5 ^ 3 = 6

Здесь мы выполняем битовое Исключающее ИЛИ между 5 и 3. Результат — 6 (0110 в двоичной системе).

Вот как это работает:

0101 (5)
^ 0011 (3)
----
0110 (6)

Результат имеет 1 где биты в исходных числах были различны.

Оператор Битового НЕ (НЕ) в Python (~)

Оператор Битового НЕ (~) — это унарный оператор (он принимает только один операнд), который переворачивает биты своего операнда. Каждый 0 становится 1, а каждый 1 становится 0.

Вот пример:

a = 5  # двоично: 0101
result = ~a
print(f"~{a} = {result}")  # Вывод: ~5 = -6

Вы можете подумать, почему результат — -6. Это потому что Python использует дополнение по модулю 2 для представления отрицательных чисел. В дополнении по модулю 2 самый левый бит представляет знак (0 для положительных, 1 для отрицательных).

Вот что происходит внутри:

00000101 (5)
~
11111010 (-6 в дополнении по модулю 2)

Оператор Битового Сдвига Влево (<<) в Python

Оператор Битового Сдвига Влево (<<) сдвигает биты первого операнда влево на количество мест, указанное вторым операндом. Новые биты справа заполняются нулями.

Посмотрим на пример:

a = 5  # двоично: 0101
b = 1
result = a << b
print(f"{a} << {b} = {result}")  # Вывод: 5 << 1 = 10

Здесь мы сдвигаем биты 5 влево на 1 позицию. Результат — 10 (1010 в двоичной системе).

Вот что происходит:

0101 (5)
Сдвиг влево на 1
1010 (10)

Каждый левый сдвиг эффективно умножает число на 2.

Оператор Битового Сдвига Вправо (>>) в Python

Оператор Битового Сдвига Вправо (>>) сдвигает биты первого операнда вправо на количество мест, указанное вторым операндом. Для положительных чисел новые биты слева заполняются нулями.

Вот пример:

a = 5  # двоично: 0101
b = 1
result = a >> b
print(f"{a} >> {b} = {result}")  # Вывод: 5 >> 1 = 2

Здесь мы сдвигаем биты 5 вправо на 1 позицию. Результат — 2 (0010 в двоичной системе).

Вот что происходит:

0101 (5)
Сдвиг вправо на 1
0010 (2)

Каждый правый сдвиг эффективно делиет число на 2 (округляя вниз до ближайшего целого).

Итак, это было! Мы погружались в мир битовых операторов в Python. Эти операторы могут показаться немного абстрактными сначала, но они — чрезвычайно мощные инструменты, особенно когда вы работаете с низкоуровневыми операциями или нуждаетесь в оптимизации производительности своего кода.

Помните, практика — это основа. Попробуйте играть с этими операторами, экспериментируйте с различными числами и смотрите, какие результаты вы получите. И не знаете этого, вы уже манипулируете битами как профи!

Счастливого кодирования, и да будут биты всегда на вашей стороне!

Credits: Image by storyset