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()
- Articles connexes :Conversion de nombres et de chaînes de caractères binaires, octaux et hexadécimaux entre eux en Python
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 &,|.
- Articles connexes :Opérateurs logiques Python et, ou, et non (conjonction, disjonction, négation logiques)
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 1 | Entrée 2 | intersection (AND) | disjonction (OR) | Opération EXCLUSIF-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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 bits
0b1111
(=0xf
) - Pour 8 bits
0xff
- Pour 16 bits
0xffff
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
- Articles connexes :Conversion de nombres et de chaînes de caractères binaires, octaux et hexadécimaux entre eux en Python
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.