Python надає такі побітові оператори, які виконують логічну кон’юнкцію, логічну диз’юнкцію, ексклюзивну диз’юнкцію, побітову інверсію, зсув бітів вліво та вправо для кожного біта значення int двійкового цілого типу відповідно.
&
|
^
~
<<
>>
У цьому розділі ми спочатку пояснюємо наступне.
- перехрестя(AND) :
&
- диз’юнкція(OR) :
|
- ЕКСКЛЮЗИВ-АБО операція(XOR) :
^
Далі ми обговоримо наступне.
- Порозрядні операції над від’ємними цілими числами
- біт фліп( NOT) :
~
- бітовий зсув:
<<
,>>
Щоб отримати додаткову інформацію про те, як записувати цілі числа в двійковій, вісімковій і шістнадцятковій системах, а також як перетворити двійкові, вісімкові та шістнадцяткові числа та рядки за допомогою наступних функцій, див. наступну статтю.
bin()
oct()
hex()
format()
- Пов’язані статті:Перетворіть двійкові, вісімкові та шістнадцяткові числа та рядки один від одного в Python
Крім того, щодо логічних операцій (логічних операцій) над логічними значеннями (true, false) замість побітових операцій див. наступну статтю. Використовуйте та,або замість &,|.
- Пов’язані статті:Логічні оператори Python and, or, and not (логічна кон’юнкція, диз’юнкція, заперечення)
перехрестя(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) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Порозрядні операції над від’ємними цілими числами
Коли порозрядна операція виконується над від’ємним цілим числом, значення обробляється так, як якщо б воно було виражене у формі доповнення до двох.
Однак зауважте, що якщо ви перетворите від’ємне ціле число в двійковий рядок за допомогою 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
- Пов’язані статті:Перетворіть двійкові, вісімкові та шістнадцяткові числа та рядки один від одного в Python
біт фліп:~оператор
~приклад перегортання бітів з операторами.
Побітова інверсія – це не просто значення кожного інвертованого біта. Повертається значення при використанні цього оператора є таким.~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
Краще мислити в термінах рядків виразів доповнення до двох, оскільки мислення в термінах чисел не зрозуміло.