Побитовые операторы Python
Побитовые операторы 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. Побитовый оператор И
Python побитовый и оператор возвращает 1, если оба бита равны 1, иначе 0.
>>> 10&7
2
>>>
2. Побитовый оператор ИЛИ
Побитовый оператор or Python возвращает 1, если какой-либо из битов равен 1. Если оба бита равны 0, он возвращает 0.
>>> 10|7
15
>>>
3. Побитовый оператор XOR
Побитовый оператор XOR Python возвращает 1, если один из битов равен 0, а другой бит равен 1. Если оба бита равны 0 или 1, он возвращает 0.
>>> 10^7
13
>>>
4. Оператор дополнения побитовых единиц
Дополнение Python Ones числа «A» равно -(A+1).
>>> ~10
-11
>>> ~-10
9
>>>
5. Побитовый оператор сдвига влево
Оператор побитового сдвига влево в Python сдвигает биты левого операнда влево на заданное количество раз в правом операнде. Проще говоря, к двоичному числу в конце добавляются 0.
>>> 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 в основном используются в математических вычислениях. Мы также можем реализовать специальные методы для поддержки побитовых операторов для наших пользовательских реализаций классов.