Побитовые операторы 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]
[]
[]
>>>

Ответить