Побитовые операторы Python используются для выполнения побитовых вычислений с целыми числами. Целые числа преобразуются в двоичный формат, после чего операции выполняются побитно, отсюда и название побитовых операторов. Побитовые операторы Python работают только с целыми числами, и окончательный результат возвращается в десятичном формате. Побитовые операторы Python также называются бинарными операторами.
Побитовые операторы Python
В Python существует 6 побитовых операторов. В таблице ниже предоставлены краткие сведения о них.
Bitwise Operator | Description | Simple Example |
---|---|---|
& | Bitwise AND Operator | 10 & 7 = 2 |
Bitwise OR Operator | ||
^ | Bitwise XOR Operator | 10 ^ 7 = 13 |
~ | Bitwise Ones’ Compliment Operator | ~10 = -11 |
<< | Bitwise Left Shift operator | 10<<2 = 40 |
>> | Bitwise Right Shift Operator | 10>>1 = 5 |
Давайте рассмотрим эти операторы поочередно и поймем, как они работают.
1. Оператор побитового И
Побитовый оператор “И” возвращает 1, если оба бита равны 1, в противном случае 0.
>>> 10&7
2
>>>

2. Оператор побитового ИЛИ
Побитовый оператор “ИЛИ” возвращает 1, если хотя бы один из битов равен 1. Если оба бита равны 0, то возвращается 0.
>>> 10|7
15
>>>

3. Побитовый оператор исключающего ИЛИ
Оператор побитового исключающего ИЛИ в Python возвращает 1, если один из битов равен 0, а другой равен 1. Если оба бита равны 0 или 1, то он возвращает 0.
>>> 10^7
13
>>>

4. Побитовый оператор дополнения единицы
Дополнение единицы числа ‘A’ в Python равно -(A+1).
>>> ~10
-11
>>> ~-10
9
>>>

5. Побитовый оператор левого сдвига
Оператор побитового левого сдвига в Python сдвигает биты левого операнда влево на заданное количество раз в правом операнде. Простыми словами, двоичное число дополняется нулями в конце.
>>> 10 << 2
40
>>>

6. Побитовый оператор правого сдвига
Правый оператор сдвига в Python является точным противоположением левого оператора сдвига. Затем биты операнда слева перемещаются в сторону правой стороны указанное количество раз. Простыми словами, биты с правой стороны удаляются.
>>> 10 >> 2
2
>>>

Перегрузка побитовых операторов в Python
Python поддерживает перегрузку операторов. Существует различные методы, которые мы можем реализовать для поддержки побитовых операторов для наших пользовательских объектов.
Bitwise Operator | Method to Implement |
---|---|
& | __and__(self, other) |
^ | __xor__(self, other) |
~ | __invert__(self) |
<< | __lshift__(self, other) |
>> | __rshift__(self, other) |
Вот пример перегрузки побитового оператора для нашего пользовательского объекта.
class Data:
id = 0
def __init__(self, i):
self.id = i
def __and__(self, other):
print('Bitwise AND operator overloaded')
if isinstance(other, Data):
return Data(self.id & other.id)
else:
raise ValueError('Argument must be object of Data')
def __or__(self, other):
print('Bitwise OR operator overloaded')
if isinstance(other, Data):
return Data(self.id | other.id)
else:
raise ValueError('Argument must be object of Data')
def __xor__(self, other):
print('Bitwise XOR operator overloaded')
if isinstance(other, Data):
return Data(self.id ^ other.id)
else:
raise ValueError('Argument must be object of Data')
def __lshift__(self, other):
print('Bitwise Left Shift operator overloaded')
if isinstance(other, int):
return Data(self.id << other)
else:
raise ValueError('Argument must be integer')
def __rshift__(self, other):
print('Bitwise Right Shift operator overloaded')
if isinstance(other, int):
return Data(self.id >> other)
else:
raise ValueError('Argument must be integer')
def __invert__(self):
print('Bitwise Ones Complement operator overloaded')
return Data(~self.id)
def __str__(self):
return f'Data[{self.id}]'
d1 = Data(10)
d2 = Data(7)
print(f'd1&d2 = {d1&d2}')
print(f'd1|d2 = {d1|d2}')
print(f'd1^d2 = {d1^d2}')
print(f'd1<<2 = {d1<<2}')
print(f'd1>>2 = {d1>>2}')
print(f'~d1 = {~d1}')
Вывод:
Bitwise AND operator overloaded
d1&d2 = Data[2]
Bitwise OR operator overloaded
d1|d2 = Data[15]
Bitwise XOR operator overloaded
d1^d2 = Data[13]
Bitwise Left Shift operator overloaded
d1<<2 = Data[40]
Bitwise Right Shift operator overloaded
d1>>2 = Data[2]
Bitwise Ones Complement operator overloaded
~d1 = Data[-11]
Если вы не знакомы с новым форматированием строк, пожалуйста, прочитайте f-строки в Python.
Сводка
Побитовые операторы в Python в основном используются в математических вычислениях. Мы можем реализовать конкретные методы для поддержки побитовых операторов в реализации наших пользовательских классов.
Source:
https://www.digitalocean.com/community/tutorials/python-bitwise-operators