web-dev-qa-db-fra.com

Pourquoi ~ True donne-t-il -2?

Dans Python:

~True

Donne moi:

-2

Pourquoi? Quelqu'un peut-il m'expliquer ce cas particulier en binaire?

131
lukaszkups

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
237
Maroun

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.

44
Martijn Pieters

~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 et
  • les entiers sont représentés en complément à deux

Modifications:

  • correction du mélange entre la représentation entière et l'opérateur d'inversion au niveau du bit
  • appliqué un autre polissage (plus le message est court, plus il faut de travail)
4
Wolf