Операции сдвига в питоне

Операции сдвига в питоне

Особый класс операций представляют поразрядные операции. Они выполняются над отдельными разрядами чисел типа int. Но чтобы понять природу поразрядных операций, надо понимать что вообще представляет число в двоичном представление.

Двоичное представление чисел

При двоичной системе каждый разряд числа может иметь только два значения — 0 и 1. Например, 0 в десятичной системе также будет равен 0 в двоичной системе, а 1 в десятичной системе будет соответствовать 1 в двоичной системе. Следующее число в десятичной системе — 2 в двоичной системе будет соответствовать 10. То есть, когда мы к 1 прибавляем 1, то результатом будет 10. И так далее.

Например, 5 в двоичном представлении 101 и имеет три разряда. Для вывода десятичного числа в двоичной системе можно применять спецификатор 0b :

number = 5 # в двоичной форме 101 print(f"number = ") # number = 101

Без указания спецификатора функция print() выводит число в десятичной системе.

При этом Python позволяет сразу определять число в двоичной форме. Для этого число в двоичной форме указывается после префикса 0b :

number = 0b101 # определяем число в двоичной форме print(f"number = ") # number = 101 print(f"number = ") # number = 5 - в десятичной системе

Еще несколько примеров сопоставления между двоичной и десятичной системами:

number1 = 1 # в двоичной системе 0b1 number2 = 2 # в двоичной системе 0b10 number3 = 3 # в двоичной системе 0b11 number4 = 4 # в двоичной системе 0b100 number5 = 5 # в двоичной системе 0b101 number6 = 6 # в двоичной системе 0b110

Логические операции

Логические операции выполняются над отдельными разрядами числа. В Python есть следующие логические операции:

    & (логическое умножение) Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:

x1 = 2 # 010 y1 = 5 # 101 z1 = x1 & y1 print(f"z1 = ") # z1 = 0 x2 = 4 # 100 y2 = 5 # 101 z2 = x2 & y2 print(f"z2 = ") # z2 = 4 print(f"z2 = ") # z2 = 100
x1 = 2 # 010 y1 = 5 # 101 z1 = x1|y1 # 111 print(f"z1 = ") # z1 = 7 print(f"z1 = ") # z1 = 111 x2 = 4 # 100 y2 = 5 # 101 z2 = x2 | y2 # 101 print(f"z2 = ") # z2 = 5 print(f"z2 = ") # z2 = 101
x = 9 # 1001 y = 5 # 0101 z = x ^ y # 1100 print(f"z = ") # z = 12 print(f"z = ") # z = 1100

Здесь число 9 в двоичной форме равно 1001. Число 5 равно 0101. Операция XOR дает следующий результат: 1^0, 0^1, 0^0, 1^1. Здесь мы видим, что первые два разряда чисел содержат разные значения, поэтому первые два разряда получат значение 1. А последние два разряда чисел содержат одинаковые значения, поэтому последние два разряда получат значение 0. Таким образом, мы получаем число 1100 или 12 в десятичной системе. нередко данную операцию применяют для простого шифрования:

x = 45 # Значение, которое надо зашифровать - в двоичной форме 101101 key = 102 # Пусть это будет ключ - в двоичной форме 1100110 encrypt = x ^ key # Результатом будет число 1001011 или 75 print(f"Зашифрованное число: ") decrypt = encrypt ^ key # Результатом будет исходное число 45 print(f"Расшифрованное число: ")
x = 9 # 1001 y = 5 # 0101 x = x ^ y y = x ^ y x = x ^ y print(f"x = ") # x = 5 print(f"y = ") # y = 9

Операции сдвига

Операции сдвига также производятся над разрядами чисел. Сдвиг может происходить вправо и влево.

Читайте также:  Import dll module python

Таким образом, если исходное число, которое надо сдвинуть в ту или другую строну, делится на два, то фактически получается умножение или деление на два. Поэтому подобную операцию можно использовать вместо непосредственного умножения или деления на два. Например:

a = 16 # в двоичной форме 10000 b = 2 c = a > b #Сдвиг числа 10000 вправо на 2 разряда, равно 100 или 4 в десятичной системе print(d) #4

При этом числа, которые участвую в операциях, необязательно должны быть кратны 2::

a = 22 # в двоичной форме 10110 b = 2 c = a > b # Сдвиг числа 10110 вправо на 2 разряда, равно 101 или 5 в десятичной системе print(d) # 5

Источник

Побитовые операторы Python

Основные операторы на Python используются для выполнения операций со значениями и переменными. Эти символы выполняют все виды вычислений. Значение, с которым работает оператор, называется операндом.

В Python побитовые операторы используются для выполнения вычислений над целыми числами в соответствии с битами. Целые числа преобразуются в binary а затем выполняются побитовые операции. Затем результат сохраняется в decimal формате.

Типы побитовых операторов в Python

1. Побитовый оператор И

Оператор возвращает 1, когда оба бита оказываются равными 1, иначе он возвращает 0.

xy = 0101 0100 = 0100 = 4 (десятичный)

2. ИЛИ

Операторы возвращают 1, когда любой из битов оказывается равным 1, иначе он возвращает 0.

xy = 0101 | 0100 = 0101 = 5 (десятичный)

3. НЕ

Утверждение возвращает одно дополнение указанного числа.

4. XOR

Оператор возвращает истину, если один из битов равен 1, а другой бит равен 0, в противном случае он возвращает ложь.

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

Читайте также:  Is html valid xml

5. Оператор побитового сдвига вправо

Он сдвигает биты числа вправо и в результате заполняет 0 на пустом месте / пустоте. Это дает эффект, подобный делению числа в некоторой степени двойки.

6. Сдвига влево

Он сдвигает биты числа влево и заполняет 0 на пустых / пустых местах, оставшихся в результате. Это дает эффект, аналогичный умножению числа на некоторую степень двойки.

Пример побитовых операторов Python

a = 5 b = 6 # Print bitwise AND operation print("a b =", a b) # Print bitwise OR operation print("a | b =", a | b) # Print bitwise NOT operation print("~a =", ~a) # print bitwise XOR operation print("a ^ b =", a ^ b) c = 10 d = -10 # print bitwise right shift operator print("c >> 1 =", c >> 1) print("d >> 1 =", d >> 1) c = 5 d = -10 # print bitwise left shift operator print("c a b = 4 a | b = 7 ~a = -6 a ^ b = 3 c >> 1 = 5 d >> 1 = -5 c 

Источник

Побитовые операторы(bitwise) в Python

Операторы bitwise в Python используются для выполнения поразрядных вычислений целых чисел. Целые числа преобразуются в двоичный формат, а затем операции выполняются побитно, отсюда и название побитовые операторы.

Они работают только с целыми числами, а окончательный результат возвращается в десятичном формате и также называются бинарными операторами.

В Python существует 6 побитовых операторов. В таблице ниже приведены краткие сведения о них.

Побитовый оператор Побитовый оператор AND 10 7 = 2
| Побитовый оператор OR 10 | 7 = 15
^ Побитовый оператор XOR 10 ^ 7 = 13
~ Побитовый оператор Ones’ Compliment ~ 10 = -11
Побитовый оператор Left Shift 10
>> Побитовый оператор Right Shift 10 >> 1 = 5

Давайте рассмотрим этих операторов один за другим и разберемся, как они работают.

1. Побитовый оператор AND

Оператор AND в Python возвращает 1, если оба бита равны 1, в противном случае – 0.

Побитовый оператор AND

2. Побитовый оператор OR

Побитовый оператор OR в Python возвращает 1, если какой-либо из битов равен 1. Если оба бита равны 0, он возвращает 0.

Побитовый оператор OR

3. Примеры с XOR

Побитовый оператор XOR в Python возвращает 1, если один из битов равен 0, а другой бит равен 1. Если оба бита равны 0 или 1, он возвращает 0.

пример XOR

4. Комплиментарный

Дополнение числа «A» в Python Ones равно – (A + 1).

Оператор Ones’ Complement

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

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

Оператор Left Shift

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

Оператор Right Shift в Python — это полная противоположность оператору сдвига влево. Затем биты левого операнда перемещаются вправо заданное количество раз.

Оператор Сдвига Вправо

Оператор побитового сдвига вправо в Python.

Перегрузка побитового оператора Python

Python поддерживает перегрузку операторов. Существуют различные методы, которые мы можем реализовать для поддержки побитовых операторов для наших настраиваемых объектов.

__and __ (я, другое)
| __или __ (я, другое)
^ __xor __ (я, другой)
~ __invert __ (сам)
__lshift __ (я, другой)
>> __rshift __ (я, другой)

Вот пример перегрузки побитового оператора для нашего настраиваемого объекта.

class Data: 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 __invert__(self): print('Bitwise Ones Complement operator overloaded') return Data(~self.id) def __str__(self): return f'Data[]' d1 = Data(10) d2 = Data(7) print(f'd1d2 = ') print(f'd1|d2 = ') print(f'd1^d2 = ') print(f'd1') print(f'd1>>2 = >2>') print(f'~d1 = ')
Bitwise AND operator overloaded d1d2 = 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[2] Bitwise Ones Complement operator overloaded ~d1 = Data[-11]

Резюме

Поразрядные операторы Python в основном используются в математических вычислениях. Мы можем реализовать определенные методы для поддержки побитовых операторов и для наших реализаций настраиваемых классов.

Источник

Оцените статью