Порозрядні оператори Python (логічний продукт, логічне АБО, виключне АБО, інверсія, зсув)

Бізнес

Python надає такі побітові оператори, які виконують логічну кон’юнкцію, логічну диз’юнкцію, ексклюзивну диз’юнкцію, побітову інверсію, зсув бітів вліво та вправо для кожного біта значення int двійкового цілого типу відповідно.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

У цьому розділі ми спочатку пояснюємо наступне.

  • перехрестя(AND) :&
  • диз’юнкція(OR) :|
  • ЕКСКЛЮЗИВ-АБО операція(XOR) :^

Далі ми обговоримо наступне.

  • Порозрядні операції над від’ємними цілими числами
  • біт фліп( NOT) :~
  • бітовий зсув:<<,>>

Щоб отримати додаткову інформацію про те, як записувати цілі числа в двійковій, вісімковій і шістнадцятковій системах, а також як перетворити двійкові, вісімкові та шістнадцяткові числа та рядки за допомогою наступних функцій, див. наступну статтю.

  • bin()
  • oct()
  • hex()
  • format()

Крім того, щодо логічних операцій (логічних операцій) над логічними значеннями (true, false) замість побітових операцій див. наступну статтю. Використовуйте та,або замість &,|.

перехрестя(AND) :&оператор

Це приклад логічного І з використанням & оператор, результат якого перетворюється на рядок у двійковому позначенні за допомогою bin().

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

диз’юнкція(OR) :|оператор

Приклад логічного продукту (АБО) за допомогою | оператор, результат якого перетворюється на рядок у двійковій формі за допомогою bin() і виводиться разом.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

ЕКСКЛЮЗИВ-АБО операція(XOR) :^оператор

Приклад логічного продукту (XOR) з використанням оператора ^ у поєднанні з результатом перетворення в рядок у двійковій записі за допомогою bin().

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

Зв’язок між входом і виводом для кожного біта логічного І, АБО та XOR показано в таблиці нижче.

Вхід 1Вхід 2перехрестя(AND)диз’юнкція(OR)ЕКСКЛЮЗИВ-АБО операція(XOR)
11110
10011
01011
00000

Порозрядні операції над від’ємними цілими числами

Коли порозрядна операція виконується над від’ємним цілим числом, значення обробляється так, як якщо б воно було виражене у формі доповнення до двох.

Однак зауважте, що якщо ви перетворите від’ємне ціле число в двійковий рядок за допомогою bin() або format(), абсолютне значення матиме знак мінус замість формату доповнення до двох.

Якщо ви хочете отримати рядок із представленням доповнення до двох, візьміть І з максимальною кількістю необхідних бітових цифр, як показано нижче.

  • Для 4-розрядних0b1111(=0xf)
  • Для 8-розрядних0xff
  • Для 16 біт0xffff

Ви можете отримати рядок представлення доповнення до двох (кожен біт інвертується і додається 1).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

біт фліп:~оператор

~приклад перегортання бітів з операторами.

Побітова інверсія – це не просто значення кожного інвертованого біта. Повертається значення при використанні цього оператора є таким.
~x#ERROR!-(x+1)

-(x+1)Це значення еквівалентне розгляду вхідного значення x як форми доповнення до двох і інвертування всіх бітів.

Як згадувалося вище, у Python, коли від’ємне ціле число перетворюється на двійковий рядок за допомогою bin(), format() тощо, воно перебуває не у формі доповнення до двох, а в абсолютному значенні зі знаком мінус. Тому перетворення ~x безпосередньо в рядок не призведе до отримання рядка з інвертованими бітами вихідного значення.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

Коли ми виконуємо операцію І і перетворюємо її в рядок представлення доповнення до двох, ми бачимо, що біти вихідного значення інвертуються.

Крім того, наприклад, щоб отримати бітовий рядок, який є 4-значним бітовим рядком, інвертованим як є (знаковий біт опущено), використовуйте format(), щоб заповнити нулі для значення І, як показано нижче.04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

бітовий зсув:<<,>>

Приклади зсуву бітів вліво та вправо за допомогою операторів зсуву бітів.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

Для негативних значень знаковий біт розширюється і зміщується, а позитивний/негативний знак залишається незмінним. Від’ємне значення – це зображення рядка з 1s повністю ліворуч.

x = -9
print(bin(x))
print(bin(x & 0xff))
# -0b1001
# 0b11110111

print(x << 1)
print(bin(x << 1))
print(bin((x << 1) & 0xff))
# -18
# -0b10010
# 0b11101110

print(x >> 1)
print(bin(x >> 1))
print(bin((x >> 1) & 0xff))
# -5
# -0b101
# 0b11111011

Краще мислити в термінах рядків виразів доповнення до двох, оскільки мислення в термінах чисел не зрозуміло.

Copied title and URL