Dans la console Python:
~True
Donne moi:
-2
Pourquoi? Quelqu'un peut-il m'expliquer ce cas particulier en binaire?
python
data-conversion
tilde
lukaszkups
la source
la source
~1
c'est-2
, essayez:True == 1
True is 1
", mais c'est vrai queTrue == 1
.UNARY_INVERT
(l'ensemble du bytecode) ajoutera quelque chose aux réponses?bool
. Il ne s'agit pas de savoir comment~
fonctionne. En fait, une réponse valable à cette question pourrait éviter de mentionner le complément de 2 et comment~
fonctionne sur les entiers.Réponses:
int(True)
est1
.1
est:et
~1
est:Qui est
-2
dans le complément à deux 11 Retournez tous les bits, ajoutez 1 au nombre résultant et interprétez le résultat comme une représentation binaire de la grandeur et ajoutez un signe négatif (puisque le nombre commence par 1):
Qui est 2, mais le signe est négatif puisque le MSB est 1.
À noter:
Pensez-y
bool
, vous constaterez qu'il est de nature numérique - Il a deux valeursTrue
etFalse
, 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 entierint
.Donc ils se comportent exactement comme 1 et 0, sauf que cela
bool
redéfinitstr
etrepr
de les afficher différemment.la source
int('1')
est aussi ,1
mais~'1'
une exception TypeError alors~True
est - ce pas parce quebool
est une sous - classe deint
@ Martijn a ajouté cette information dans sa réponse.True == -1
, et j'en connais beaucoup où l'on pourrait dire çaTrue == 1
...-1
pour TRUE; il a la belle propriété que les opérateurs binaires AND et OR fonctionnent également pour les ET et OU logiques (x & -1
est non nul dans les mêmes cas quex && 1
non nul en C), tant que vous ne vous souciez pas du court-circuit . Cependant, pour autant que je sache, aucun langage courant n'a jamais utilisé-1
VRAI.truth
comme sans valeur; avec tout ce qui est pastrue
êtrefalse
. Tous les langages de programmation dont je suis conscient tournent la logique formelle sur sa tête, définissantfalse
comme non valorisé (0) et tout ce qui n'est pas un être fauxtrue
). Par exemple, C # , bien que Javascript soit quelque peu aberrant, ayant plusieurs saveurs de vérité et plusieurs saveurs de fausseté .Le
bool
type Python est une sous-classe deint
(pour des raisons historiques; les booléens n'ont été ajoutés que dans Python 2.3).Depuis
int(True)
est1
,~True
est~1
est-2
.Voir PEP 285 pour savoir pourquoi
bool
est une sous-classe deint
.Si vous vouliez l'inverse booléen, utilisez
not
:Si vous voulez savoir pourquoi
~1
est-2
, il est parce que vous êtes tous les bits dans inverseuses un entier signé;00000001
devient1111110
qui dans un entier signé est un nombre négatif, voir Complément à deux :où le
1
bit initial signifie que la valeur est négative, et le reste des bits codent l'inverse du nombre positif moins un.la source
struct.pack
, commebin(integer)
ouformat(integer, '08b')
ne pas prendre en compte les entiers signés.bin(~True)
,bin(-2)
,bin(~1)
tout donne'-0b10'
Si la-2
représentation est10
alors pourquoi-
signe.10
lui - même 2'complement alors -ve?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
n'est pas surprenant siTrue
signifie1
et~
signifie l' inversion au niveau du bit ...... à condition que
True
peut être traité comme un entier etModifications:
la source
~
ne signifie pas "complément 2s".~
signifie "Bitwise Inversion"