Python proporciona els següents operadors de bits, que realitzen conjunció lògica, disjunció lògica, disjunció exclusiva, inversió per bits, desplaçament de bits a l’esquerra i desplaçament de bits a la dreta en cada bit d’un valor int de tipus enter binari, respectivament.
&
|
^
~
<<
>>
En aquest apartat, primer expliquem el següent.
- intersecció(AND) :
&
- disjunció(OR) :
|
- Operació EXCLUSIVA-OR(XOR) :
^
A continuació, parlarem del següent.
- Operacions bit a bit sobre nombres enters negatius
- una mica de volteig( NOT) :
~
- canvi de bits:
<<
,>>
Per obtenir més informació sobre com escriure nombres enters en binari, octal i hexadecimal, i com convertir nombres i cadenes binaris, octals i hexadecimals mitjançant les funcions següents, consulteu l’article següent.
bin()
oct()
hex()
format()
- Articles relacionats:Converteix nombres i cadenes binaris, octals i hexadecimals entre i des de l’altre a Python
A més, per a operacions lògiques (operacions booleanes) sobre valors booleans (true, false) en lloc d’operacions per bits, consulteu l’article següent. Utilitzeu i, o en lloc de &,|.
- Articles relacionats:Operadors lògics de Python i, o, i no (conjunció lògica, disjunció, negació)
intersecció(AND) :&operador
Aquest és un exemple d’un AND lògic que utilitza el & operador, amb el resultat convertit en una cadena en notació binària mitjançant bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disjunció(OR) :|operador
Un exemple de producte lògic (OR) que utilitza el | operador, amb el resultat convertit en una cadena en notació binària mitjançant bin() i la sortida junts.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Operació EXCLUSIVA-OR(XOR) :^operador
Exemple d’un producte lògic (XOR) que utilitza l’operador ^, combinat amb el resultat de la conversió a una cadena en notació binària mitjançant bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
La relació entre l’entrada i la sortida per a cada bit de AND, OR i XOR lògic es mostra a la taula següent.
Entrada 1 | Entrada 2 | intersecció(AND) | disjunció(OR) | Operació EXCLUSIVA-OR(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Operacions bit a bit sobre nombres enters negatius
Quan es realitza una operació bit a bit sobre un nombre enter negatiu, el valor es processa com si s’expressés en forma de complement a dos.
Tingueu en compte, però, que si convertiu un nombre enter negatiu en una cadena binària mitjançant bin() o format(), el valor absolut tindrà un signe menys en lloc d’un format de complement a dos.
Si voleu obtenir una cadena amb la representació del complement a dos, preneu AND amb el nombre màxim de dígits de bits necessaris, tal com es mostra a continuació.
- Per a 4 bits
0b1111
(=0xf
) - Per a 8 bits
0xff
- Per a 16 bits
0xffff
Podeu obtenir una cadena de representació del complement a dos (cada bit s’inverteix i s’afegeix 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Articles relacionats:Converteix nombres i cadenes binaris, octals i hexadecimals entre i des de l’altre a Python
una mica de volteig:~operador
~exemple de canvi de bits amb operadors.
La inversió bit a bit no és simplement el valor de cada bit invertit. El valor de retorn quan s’utilitza aquest operador és el següent.~x
#ERROR!-(x+1)
-(x+1)
Aquest valor equival a considerar el valor d’entrada x com una forma de complement a dos i invertir tots els bits.
Com s’ha esmentat anteriorment, a Python, quan un nombre enter negatiu es converteix en una cadena binària mitjançant bin(), format(), etc., no és en forma de complement de dos, sinó en valor absolut amb un signe menys. Per tant, convertir ~x directament en una cadena no donarà lloc a una cadena amb els bits del valor original invertits.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Quan realitzem l’operació AND i la convertim en una cadena de representació del complement a dos, podem veure que els bits del valor original estan invertits.
A més, per exemple, per obtenir una cadena de bits que sigui una cadena de bits de 4 dígits invertida tal com és (s’ha omès el bit de signe), utilitzeu format() per omplir els zeros del valor AND de la manera següent04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
canvi de bits:<<,>>
Exemples de desplaçament de bits a l’esquerra i desplaçament de bits a la dreta utilitzant operadors de desplaçament de bits.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
Per als valors negatius, el bit de signe s’estén i es desplaça, i el signe positiu/negatiu continua sent el mateix. Un valor negatiu és una imatge d’una línia d’1s tot cap a l’esquerra.
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
És millor pensar en termes de cadenes d’expressions de complement a dos, ja que pensar en termes de nombres no és clar.