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