Operadors Python per bits (producte lògic, OR lògic, OR exclusiu, inversió, desplaçament)

Negocis

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()

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 &,|.

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 1Entrada 2intersecció(AND)disjunció(OR)Operació EXCLUSIVA-OR(XOR)
11110
10011
01011
00000

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 bits0b1111(=0xf)
  • Per a 8 bits0xff
  • Per a 16 bits0xffff

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

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.

Copied title and URL