En la consola de Python:
~True
Me da
-2
¿Por qué? ¿Alguien puede explicarme este caso particular en binario?
python
data-conversion
tilde
lukaszkups
fuente
fuente
~1
es-2
, intente:True == 1
True is 1
", pero es cierto esoTrue == 1
.UNARY_INVERT
(todo el código de bytes) agregará algo a las respuestas?bool
. No se trata de cómo~
funciona. De hecho, una respuesta válida a esta pregunta podría evitar mencionar el complemento de 2 y cómo~
funciona en los enteros.Respuestas:
int(True)
es1
.1
es:y
~1
es:Que está
-2
en el complemento 1 de Two1 Voltee todos los bits, agregue 1 al número resultante e interprete el resultado como una representación binaria de la magnitud y agregue un signo negativo (ya que el número comienza con 1):
Que es 2, pero el signo es negativo ya que el MSB es 1.
Vale la pena mencionar:
Piense acerca de
bool
, usted encontrará que es numérico en la naturaleza - Tiene dos valores,True
yFalse
, y son simplemente versiones de los números enteros 1 y 0 que sólo se imprimen de forma diferente "a medida". Son subclases del tipo enteroint
.Entonces se comportan exactamente como 1 y 0, excepto que los
bool
redefinestr
y losrepr
muestra de manera diferente.fuente
int('1')
también es1
sino~'1'
ser una excepción TypeError mientras que~True
no es esto se debe a quebool
es una subclase deint
@ Martijn añadió esta información en su respuesta.True == -1
, y sé muchos dónde se podría decir queTrue == 1
...-1
para VERDADERO; tiene la buena propiedad de que los operadores AND y OR a nivel de bits también funcionan para AND y OR lógicos (x & -1
no es cero en los mismos casos quex && 1
no es cero en C), siempre y cuando no le importe el cortocircuito . Sin embargo, hasta donde yo sé, ningún lenguaje convencional se ha utilizado-1
para VERDADERO.truth
como no valorada; con todo lo que no estrue
serfalse
. Todos los lenguajes de programación que conozco se vuelven lógicos formales, definiéndolosfalse
como no valorados (0) y todo eso no es ser falsotrue
). Por ejemplo, C # , aunque Javascript es algo atípico, tiene múltiples sabores de veracidad y múltiples sabores de falsedad .El
bool
tipo Python es una subclase deint
(por razones históricas; los booleanos solo se agregaron en Python 2.3).Como
int(True)
es1
,~True
es~1
es-2
.Ver PEP 285 para saber por qué
bool
es una subclase deint
.Si quería el inverso booleano, use
not
:Si quería saber por qué
~1
es así-2
, es porque está invirtiendo todos los bits en un entero con signo;00000001
se convierte en1111110
el cual en una firmado entero es un número negativo, ver el complemento a dos :donde el
1
bit inicial significa que el valor es negativo, y el resto de los bits codifican el inverso del número positivo menos uno.fuente
struct.pack
, comobin(integer)
oformat(integer, '08b')
no tener en cuenta enteros firmados.bin(~True)
, por ejemplobin(-2)
,bin(~1)
todo da'-0b10'
Si la-2
representación es10
entonces por qué-
firmar.10
con 2'complemento entonces -ve?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
se no es sorprendente siTrue
los medios1
y los~
medios bit a bit de inversión ...... siempre que
True
puede ser tratado como un entero yEdiciones:
fuente
~
no significa "complemento 2s".~
significa "Inversión a nivel de bits"