En la consola de Python:
~True
Me da
-2
¿Por qué? ¿Alguien puede explicarme este caso particular en binario?
fuente
En la consola de Python:
~True
Me da
-2
¿Por qué? ¿Alguien puede explicarme este caso particular en binario?
int(True)
es 1
.
1
es:
00000001
y ~1
es:
11111110
Que está -2
en el complemento 1 de Two
1 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):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 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
y False
, 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 entero int
.
Entonces se comportan exactamente como 1 y 0, excepto que los bool
redefine str
y los repr
muestra de manera diferente.
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
int('1')
también es 1
sino ~'1'
ser una excepción TypeError mientras que ~True
no es esto se debe a que bool
es una subclase de int
@ Martijn añadió esta información en su respuesta.
True == -1
, y sé muchos dónde se podría decir que True == 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 que x && 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 es true
ser false
. Todos los lenguajes de programación que conozco se vuelven lógicos formales, definiéndolos false
como no valorados (0) y todo eso no es ser falso true
). 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 de int
(por razones históricas; los booleanos solo se agregaron en Python 2.3).
Como int(True)
es 1
, ~True
es ~1
es -2
.
Ver PEP 285 para saber por qué bool
es una subclase de int
.
Si quería el inverso booleano, use not
:
>>> not True
False
>>> not False
True
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 en 1111110
el cual en una firmado entero es un número negativo, ver el complemento a dos :
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
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.
struct.pack
, como bin(integer)
o format(integer, '08b')
no tener en cuenta enteros firmados.
bin(~True)
, por ejemplo bin(-2)
, bin(~1)
todo da '-0b10'
Si la -2
representación es 10
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 si True
los medios 1
y los ~
medios bit a bit de inversión ...
... siempre que
True
puede ser tratado como un entero yEdiciones:
~
no significa "complemento 2s". ~
significa "Inversión a nivel de bits"
~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.