tildes - unicode python
¿Por qué ~ Verdadero resultado en-2? (3)
En la consola de Python:
~True
Me da:
-2
¿Por qué? ¿Puede alguien explicarme este caso en particular en binario?
¿Qué es int(True)
? Es 1
.
1
es:
00000001
y ~1
es:
11111110
Que es -2
en el complemento de Dos 1
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 en bool
, encontrará que es de naturaleza numérica. Tiene dos valores, True
y False
, y solo son versiones "personalizadas" de los enteros 1 y 0 que solo se imprimen de forma diferente. Son subclases del tipo entero int
.
Entonces se comportan exactamente como 1 y 0, excepto que bool
redefine str
y repr
para mostrarlos de manera diferente.
>>> type(True)
<class ''bool''>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they''re still different objects
False
El tipo de bool
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 por qué bool
es una subclase de int
.
Si quería el booleano inverso, use not
:
>>> not True
False
>>> not False
True
Si quisieras saber por qué ~1
es -2
, es porque estás invirtiendo todos los bits en un entero con signo; 00000001
convierte en 1111110
que en un número entero con signo es un número negativo, ver Complemento de 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.
~True == -2
no es sorprendente si True
significa 1
y ~
significa inversión en modo bit ...
... siempre que
-
True
se puede tratar como un entero y - los números enteros están representados en complemento a Dos
Ediciones:
- se corrigió la mezcla entre la representación entera y el operador de inversión bit a bit
- aplicado otro pulido (cuanto más corto es el mensaje, más trabajo se necesita)