Dans Python:
~True
Donne moi:
-2
Pourquoi? Quelqu'un peut-il m'expliquer ce cas particulier en binaire?
int(True)
est 1
.
1
est:
00000001
et ~1
est:
11111110
Lequel est -2
in Complément à deux1
1 Retournez tous les bits, ajoutez 1 au nombre résultant et interprétez le résultat comme une représentation binaire de la magnitude et ajoutez un signe négatif (puisque le nombre commence avec 1):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
Ce qui est 2, mais le signe est négatif car le MSB est 1.
À noter:
Pensez à bool
, vous constaterez qu'il est de nature numérique - Il a deux valeurs, True
et False
, et ce ne sont que des versions "personnalisées" des entiers 1 et 0 qui ne s'impriment différemment. Ce sont des sous-classes de type entier int
.
Ils se comportent donc exactement comme 1 et 0, sauf que bool
redéfinit str
et repr
pour les afficher différemment.
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
Le type Python bool
est une sous-classe de int
(pour des raisons historiques; les booléens ont été ajoutés uniquement dans Python 2.3) .
Puisque int(True)
est 1
, ~True
est ~1
est -2
.
Voir PEP 285 pour savoir pourquoi bool
est une sous-classe de int
.
Si vous vouliez l'inverse booléen, utilisez not
:
>>> not True
False
>>> not False
True
Si vous vouliez savoir pourquoi ~1
est -2
, c'est parce que vous inversez tous les bits dans un entier signé; 00000001
devient 1111110
qui dans un entier signé est un nombre négatif, voir Complément à deux :
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
où l'initiale 1
bit signifie que la valeur est négative et que les autres bits codent l'inverse du nombre positif moins un.
~True == -2
n'est pas surprenant si True
signifie 1
et ~
signifie inversion au niveau du bit ...
... à condition que
True
peut être traité comme un entier etModifications: