Operatori bitwise Python (produs logic, OR logic, OR exclusiv, inversiune, shift)

Afaceri

Python pune la dispoziție următorii operatori bitwise, care efectuează conjuncția logică, disjuncția logică, disjuncția exclusivă, inversarea bitwise, deplasarea bitului la stânga și, respectiv, deplasarea bitului la dreapta pe fiecare bit al unei valori binare de tip întreg int.

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

În această secțiune, vom explica mai întâi următoarele.

  • intersecție (AND) : &
  • disjuncție (OR) : |
  • Operațiunea EXCLUSIV-OR (XOR) : ^

În continuare, vom discuta următoarele.

  • Operații de tip bitwise pe numere întregi negative
  • răsturnare de biți ( NOT) : ~
  • schimbare de bit : << , >>

Pentru mai multe informații despre cum să scrieți numere întregi în binar, octal și hexazecimal și cum să convertiți numere și șiruri de caractere binare, octale și hexazecimale utilizând următoarele funcții, consultați următorul articol.

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

De asemenea, pentru operații logice (operații booleene) pe valori booleene (true, false) în loc de operații bitwise, consultați următorul articol. Utilizați and,or în loc de &,|.

intersecție (AND) : &operator

Acesta este un exemplu de ȘI logic folosind operatorul &, rezultatul fiind convertit într-un șir de caractere în notație binară prin bin().

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

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

disjuncție (OR) : |operator

Un exemplu de produs logic (OR) folosind operatorul |, cu rezultatul convertit într-un șir de caractere în notație binară prin bin() și ieșit împreună.

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

Operațiunea EXCLUSIV-OR (XOR) : ^operator

Exemplu de produs logic (XOR) folosind operatorul ^, combinat cu rezultatul conversiei într-un șir de caractere în notație binară folosind bin().

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

Relația dintre intrarea și ieșirea pentru fiecare bit al funcțiilor logice AND, OR și XOR este prezentată în tabelul de mai jos.

Intrarea 1Intrarea 2intersecție (AND)disjuncție (OR)Operațiunea EXCLUSIV-OR (XOR)
11110
10011
01011
00000

Operații de tip bitwise pe numere întregi negative

Atunci când se efectuează o operație de tip „bitwise” pe un număr întreg negativ, valoarea este procesată ca și cum ar fi fost exprimată sub forma complementului la doi.

Cu toate acestea, rețineți că, în cazul în care convertiți un număr întreg negativ într-un șir binar utilizând bin() sau format(), valoarea absolută va avea un semn minus în loc de un format de complement la doi.

Dacă doriți să obțineți un șir de caractere cu reprezentare complementară la doi, luați AND cu numărul maxim de cifre de biți necesar, așa cum se arată mai jos.

  • Pentru 4 biți0b1111 (=0xf)
  • Pentru 8 biți0xff
  • Pentru 16 biți0xffff

Puteți obține un șir de reprezentări în complement de doi (fiecare bit este inversat și se adaugă 1).

x = -9

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

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

răsturnare de biți : ~operator

~exemplu de inversare de biți cu operatori.

Inversia bit cu bit nu reprezintă pur și simplu valoarea fiecărui bit inversat. Valoarea de returnare atunci când se utilizează acest operator este următoarea.
~x=-(x+1)

-(x+1)Această valoare este echivalentă cu considerarea valorii de intrare x ca o formă complementară la doi și inversarea tuturor biților.

După cum s-a menționat mai sus, în Python, atunci când un număr întreg negativ este convertit într-un șir binar folosind bin(), format() etc., acesta nu este în forma complementului la doi, ci în valoare absolută cu semnul minus. Prin urmare, conversia directă a lui ~x într-un șir de caractere nu va avea ca rezultat un șir de caractere cu biții valorii originale inversați.

x = 9  # 0b1001

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

Atunci când efectuăm operația AND și o transformăm într-un șir de reprezentări cu complementul la doi, putem observa că biții din valoarea originală sunt inversați.

În plus, de exemplu, pentru a obține un șir de biți care este un șir de biți de 4 cifre inversat ca atare (bitul de semn omis), utilizați format() pentru a completa zerourile pentru valoarea ANDed după cum urmează'04b'

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

schimbare de bit : << , >>

Exemple de deplasare a bitului spre stânga și de deplasare a bitului spre dreapta cu ajutorul operatorilor de deplasare a bitului.

x = 9  # 0b1001

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

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

Pentru valorile negative, bitul de semn este extins și decalat, iar semnul pozitiv\negativ rămâne același. O valoare negativă este o imagine a unei linii de 1-uri până la stânga.

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

Este mai bine să se gândească în termeni de șiruri de expresii cu complementul lui doi, deoarece gândirea în termeni de numere nu este clară.

Copied title and URL