Opérateurs bitwise Python (produit logique, OU logique, OU exclusif, inversion, décalage)

Affaires

Python fournit les opérateurs binaires suivants, qui effectuent respectivement une conjonction logique, une disjonction logique, une disjonction exclusive, une inversion binaire, un décalage du bit gauche et un décalage du bit droit sur chaque bit d'une valeur int de type entier binaire.

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

Dans cette section, nous expliquons d'abord ce qui suit.

  • intersection (AND) : &
  • disjonction (OR) : |
  • Opération EXCLUSIF-OR (XOR) : ^

Ensuite, nous aborderons les points suivants.

  • Opérations par bit sur les entiers négatifs
  • retournement de bits ( NOT) : ~
  • décalage de bits : << , >>

Pour plus d'informations sur la manière d'écrire des nombres entiers en binaire, octal et hexadécimal, et sur la manière de convertir des nombres et des chaînes binaires, octaux et hexadécimaux à l'aide des fonctions suivantes, consultez l'article suivant.

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

De même, pour les opérations logiques (opérations booléennes) sur des valeurs booléennes (vrai, faux) au lieu des opérations binaires, consultez l'article suivant. Utilisez and,or au lieu de &,|.

intersection (AND) : &opérateur

Voici un exemple de ET logique utilisant l'opérateur &, le résultat étant converti en une chaîne de caractères en notation binaire par bin().

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

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

disjonction (OR) : |opérateur

Un exemple de produit logique (OR) utilisant l'opérateur |, avec le résultat converti en une chaîne de caractères en notation binaire par bin() et sorti ensemble.

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

Opération EXCLUSIF-OR (XOR) : ^opérateur

Exemple de produit logique (XOR) utilisant l'opérateur ^, combiné au résultat de la conversion en chaîne de caractères en notation binaire à l'aide de bin().

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

La relation entre l'entrée et la sortie pour chaque bit des fonctions logiques AND, OR et XOR est présentée dans le tableau ci-dessous.

Entrée 1Entrée 2intersection (AND)disjonction (OR)Opération EXCLUSIF-OR (XOR)
11110
10011
01011
00000

Opérations par bit sur les entiers négatifs

Lorsqu'une opération par bit est effectuée sur un nombre entier négatif, la valeur est traitée comme si elle était exprimée sous forme de complément à deux.

Notez cependant que si vous convertissez un entier négatif en chaîne binaire à l'aide de bin() ou format(), la valeur absolue aura un signe moins au lieu du format complément à deux.

Si vous voulez obtenir une chaîne de caractères avec une représentation en complément à deux, prenez ET avec le nombre maximum de chiffres de bits requis, comme indiqué ci-dessous.

  • Pour 4 bits0b1111 (=0xf)
  • Pour 8 bits0xff
  • Pour 16 bits0xffff

Vous pouvez obtenir une chaîne de représentation en complément à deux (chaque bit est inversé et le 1 est ajouté).

x = -9

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

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

retournement de bits : ~opérateur

~exemple de bit flipping avec des opérateurs.

L'inversion par bit n'est pas simplement la valeur de chaque bit inversé. La valeur de retour lors de l'utilisation de cet opérateur est la suivante.
~x=-(x+1)

-(x+1)Cette valeur est équivalente à considérer la valeur d'entrée x comme un complément à deux et à inverser tous les bits.

Comme mentionné ci-dessus, en Python, lorsqu'un nombre entier négatif est converti en chaîne binaire à l'aide de bin(), format(), etc., il n'est pas sous forme de complément à deux, mais en valeur absolue avec un signe moins. Par conséquent, la conversion directe de ~x en une chaîne de caractères n'aboutira pas à une chaîne dont les bits de la valeur originale sont inversés.

x = 9  # 0b1001

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

Lorsque nous effectuons l'opération ET et la transformons en une chaîne de représentation en complément à deux, nous pouvons constater que les bits de la valeur originale sont inversés.

De plus, par exemple, pour obtenir une chaîne de bits qui est une chaîne de bits à 4 chiffres inversée telle quelle (bit de signe omis), utilisez format() pour remplir les zéros de la valeur ANDée comme suit'04b'

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

décalage de bits : << , >>

Exemples de décalage de bit gauche et de décalage de bit droit à l'aide d'opérateurs de décalage de bit.

x = 9  # 0b1001

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

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

Pour les valeurs négatives, le bit de signe est étendu et décalé, et le signe positif/négatif reste le même. Une valeur négative est l'image d'une ligne de 1 tout à fait à gauche.

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

Il est préférable de penser en termes de chaînes d'expressions de complément à deux, car penser en termes de nombres n'est pas clair.