No console do Python:
~True
Dá-me:
-2
Por quê? Alguém pode me explicar esse caso em particular em binário?
python
data-conversion
tilde
lukaszkups
fonte
fonte
~1
é-2
, tente:True == 1
True is 1
", mas é verdade issoTrue == 1
.UNARY_INVERT
(todo o bytecode) adicionará algo às respostas?bool
. Não é sobre como~
funciona. De fato, uma resposta válida para essa pergunta pode evitar mencionar o complemento de 2 e como~
funciona em números inteiros.Respostas:
int(True)
é1
.1
é:e
~1
é:Que está
-2
no complemento do Two 11 Gire todos os bits, adicione 1 ao número resultante e interprete o resultado como uma representação binária da magnitude e adicione um sinal negativo (já que o número começa com 1):
Qual é 2, mas o sinal é negativo, pois o MSB é 1.
Vale a pena mencionar:
Pense
bool
, você descobrirá que é de natureza numérica - tem dois valoresTrue
eFalse
, e eles são apenas versões "personalizadas" dos números inteiros 1 e 0 que somente se imprimem de maneira diferente. Eles são subclasses do tipo inteiroint
.Portanto, eles se comportam exatamente como 1 e 0, exceto que
bool
redefinestr
erepr
para exibi-los de maneira diferente.fonte
int('1')
também é1
, mas~'1'
ser uma exceção TypeError enquanto~True
não é isso é porquebool
é uma subclasse deint
@ Martijn adicionou esta informação na sua resposta.True == -1
, e sei que muitos que se poderia dizer queTrue == 1
...-1
para VERDADEIRO; ele tem a propriedade legal de que os operadores AND e OR bit a bit também trabalham para AND e OR lógicos (x & -1
é diferente de zero nos mesmos casos quex && 1
é diferente de zero em C), desde que você não se preocupe com curtos-circuitos . No entanto, até onde eu sei, nenhum idioma convencional já usou o-1
TRUE.truth
como desvalorizada; com tudo o que não estátrue
sendofalse
. Todas as linguagens de programação que eu conheço mudam de lógica formal, definindofalse
como desvalorizado (0) e tudo o que não é falsotrue
). Por exemplo, C # , embora o Javascript seja um pouco estranho, com vários sabores de veracidade e vários sabores de falsidade .O
bool
tipo Python é uma subclasse deint
(por razões históricas; os booleanos foram adicionados apenas no Python 2.3).Desde que
int(True)
é1
,~True
é~1
é-2
.Veja PEP 285 para saber por que
bool
uma subclasse deint
.Se você queria o inverso booleano, use
not
:Se você queria saber por que
~1
é-2
, é porque você está invertendo todos os bits em um inteiro assinado;00000001
torna-se1111110
que em um número inteiro assinado é um número negativo, consulte o complemento de dois :onde o
1
bit inicial significa que o valor é negativo e o restante dos bits codifica o inverso do número positivo menos um.fonte
struct.pack
, comobin(integer)
ouformat(integer, '08b')
não tomar inteiros assinados em conta.bin(~True)
, por exemplobin(-2)
,bin(~1)
tudo dá'-0b10'
Se-2
representação é10
então por que-
assinar.10
2'complemento então -ve?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
não é surpreendente seTrue
meios1
e~
meios inversão bit a bit ...... desde que
True
pode ser tratado como um número inteiro eEditar% s:
fonte
~
não significa "complemento 2s".~
significa "Inversão por bits"