Python Language Pas au bit


Exemple

L'opérateur ~ retournera tous les bits du numéro. Puisque les ordinateurs utilisent des représentations de nombres signés - plus particulièrement, la notation de complément à deux pour encoder des nombres binaires négatifs où les nombres négatifs sont écrits avec un premier (1) au lieu d'un zéro initial (0).

Cela signifie que si vous utilisiez 8 bits pour représenter vos deux nombres complémentaires, vous traiteriez les modèles de 0000 0000 à 0111 1111 pour représenter les nombres de 0 à 127 et réserver 1xxx xxxx pour représenter les nombres négatifs.

Les nombres de complément à deux bits de huit bits

Morceaux Valeur non signée Valeur du complément à deux
0000 0000 0 0
0000 0001 1 1
0000 0010 2 2
0111 1110 126 126
0111 1111 127 127
1000 0000 128 -128
1000 0001 129 -127
1000 0010 130 -126
1111 1110 254 -2
1111 1111 255 -1

Essentiellement, cela signifie que 1010 0110 a une valeur non signée de 166 (obtenue en ajoutant (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0) ), il a une valeur de complément à deux de -90 (obtenue en ajoutant (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0) , et en complément de la valeur).

De cette manière, les nombres négatifs sont réduits à -128 ( 1000 0000 ). Zéro (0) est représenté par 0000 0000 et moins un (-1) que 1111 1111 .

En général, cependant, cela signifie ~n = -n - 1 .

# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111
    
# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110

# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101

# 123 = 0b0111 1011
~123
# Out: -124
# -124 = 0b1000 0100

Notez que l'effet global de cette opération, appliqué aux nombres positifs, peut être résumé:

~n -> -|n+1|

Et puis, appliqué aux nombres négatifs, l'effet correspondant est:

~-n -> |n-1|

Les exemples suivants illustrent cette dernière règle ...

# -0 = 0b0000 0000
~-0
# Out: -1 
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always
    
# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000

# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001

# -123 = 0b1111 1011
~-123
# Out: 122
# 122 = 0b0111 1010