Побитовые операторы Python
Побитовые (поразрядные) операторы и битовые манипуляции похожи на рекурсию в том смысле, что они являются фундаментальными для вычислений темами, но количество их использования будет варьироваться в зависимости от вашего домена. Битовые манипуляции важны для собеседований в таких компаниях, как bigN (Google, FB и т. Д.), и в других местах, где ожидается и требуется глубокое знание основ. Это также очень важно при работе со встроенными системами и в некоторых других областях.
Применение побитовых операторов в вычислениях
- Программирование встроенных систем
- Алгоритмы шифрования и сжатия
- Культурная осведомленность в эпоху высоких технологий
- Низкоуровневое программирование
- Работа с графикой
- Драйверы устройств для основных операционных систем
- Сборка пакетов протокола связи
Знание поразрядных операторов также важно с точки зрения культурного образования в век информации. Технологии окружают нас в повседневной жизни, и есть смысл иметь некоторое представление о человеческих знаниях, которые лежат в основе их существования.
Некоторые из наиболее часто используемых побитовых операторов:
- & (побитовое И)
- | (побитовое ИЛИ)
- ~ (побитовое НЕ)
- ^ (побитовое исключающее ИЛИ)
- << (побитовый сдвиг влево)
- >> (побитовый сдвиг вправо)
Вы можете поэкспериментировать с этими операторами в оболочке Python, что является отличным способом получить быстрое представление о том, как работает некоторая часть функциональности Python.
Например:
>>> 16 >> 1 # Divide by 2
8
>>> 12 << 2 # Multiply by 4
48
>>> 11 & 1 # A trick to check for even/odd
1
>>>
Эти операторы станут более понятными, если вы посмотрите на двоичное представление операндов. Ниже я привел код, который может вам пригодиться. Имейте в виду, что форматирование, которое я использовал, будет работать только для положительных значений.
# A couple of useful functions
print(int('00100001', 2)) # Convert binary number in string form to decimal int
print(bin(20)) # String representation of binary number
# Python Bitwise Operator Examples
# NB the output is designed to work for positive values only!
a = 24
b = 9
c = a & b # Bitwise AND
print(f"{a} & {b} = {c}")
print()
print(f" {bin(a)[2:].zfill(8)}")
print(f"& {bin(b)[2:].zfill(8)}")
print("----------")
print(f"= {bin(c)[2:].zfill(8)}")
print()
c = a | b # Bitwise OR
print(f"{a} | {b} = {c}")
print()
print(f" {bin(a)[2:].zfill(8)}")
print(f"| {bin(b)[2:].zfill(8)}")
print("----------")
print(f"= {bin(c)[2:].zfill(8)}")
print()
c = a ^ b # Bitwise XOR
print(f"{a} ^ {b} = {c}")
print()
print(f" {bin(a)[2:].zfill(8)}")
print(f"^ {bin(b)[2:].zfill(8)}")
print("----------")
print(f"= {bin(c)[2:].zfill(8)}")
print()
b = 2
c = a >> b # Right-shift by 2. I.e a // 4
print(f"{a} >> {b} = {c}")
print()
print(f" {bin(a)[2:].zfill(8)}")
print(f">> {b} {bin(b)[2:].zfill(8)}")
print("--------------")
print(f"= {bin(c)[2:].zfill(8)}")
print()
b = 2
c = a << b # Left-shift by 2. I.e a * 4
print(f"{a} << {b} = {c}")
print()
print(f" {bin(a)[2:].zfill(8)}")
print(f"<< {b} {bin(b)[2:].zfill(8)}")
print("--------------")
print(f"= {bin(c)[2:].zfill(8)}")
print()
Основная часть кода даст следующий результат:
24 & 9 = 8
00011000
& 00001001
----------
= 00001000
24 | 9 = 25
00011000
| 00001001
----------
= 00011001
24 ^ 9 = 17
00011000
^ 00001001
----------
= 00010001
24 >> 2 = 6
00011000
>> 2 00000010
--------------
= 00000110
24 << 2 = 96
00011000
<< 2 00000010
--------------
= 01100000
Программа Python с использованием побитовых операторов
Следующая программа использует поразрядные операторы Python для сбора степеней 2
, которые можно использовать для представления десятичного числа, предоставленного в качестве аргументов.
def binary_decomp(n):
powers = []
i = 1
while i <= n:
if i & n:
powers.append(i)
i <<= 1
return powers
print(binary_decomp(10))
print(binary_decomp(32))
print(binary_decomp(127))
print(binary_decomp(-24))
print(binary_decomp(0))
Вывод:
[2, 8]
[32]
[1, 2, 4, 8, 16, 32, 64]
[]
[]
>>>