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()
- Articole conexe:Conversia numerelor binare, octale și hexazecimale și a șirurilor de caractere între ele în Python
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 1 | Intrarea 2 | intersecție (AND) | disjuncție (OR) | Operațiunea EXCLUSIV-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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ți
0b1111
(=0xf
) - Pentru 8 biți
0xff
- Pentru 16 biți
0xffff
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
- Articole conexe:Conversia numerelor binare, octale și hexazecimale și a șirurilor de caractere între ele în Python
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ă.