Побитовые операторы 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. Оператор побитового И

Побитовый оператор “И” возвращает 1, если оба бита равны 1, в противном случае 0.

>>> 10&7
2
>>> 
Python Bitwise And Operator

2. Оператор побитового ИЛИ

Побитовый оператор “ИЛИ” возвращает 1, если хотя бы один из битов равен 1. Если оба бита равны 0, то возвращается 0.

>>> 10|7
15
>>> 
Python Bitwise Or Operator

3. Побитовый оператор исключающего ИЛИ

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

>>> 10^7
13
>>> 
Python Bitwise XOR Operator

4. Побитовый оператор дополнения единицы

Дополнение единицы числа ‘A’ в Python равно -(A+1).

>>> ~10
-11
>>> ~-10
9
>>> 
Python Bitwise Ones Complement Operator

5. Побитовый оператор левого сдвига

Оператор побитового левого сдвига в Python сдвигает биты левого операнда влево на заданное количество раз в правом операнде. Простыми словами, двоичное число дополняется нулями в конце.

>>> 10 << 2
40
>>> 
Python Bitwise Left Shift Operator

6. Побитовый оператор правого сдвига

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

>>> 10 >> 2
2
>>>  
Python Bitwise Right Shift Operator

Перегрузка побитовых операторов в 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