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

~1es-2, intente:True == 1True 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.1es:y
~1es:Que está
-2en 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,TrueyFalse, 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
boolredefinestry losreprmuestra de manera diferente.fuente
int('1')también es1sino~'1'ser una excepción TypeError mientras que~Trueno es esto se debe a quebooles 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...-1para 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 & -1no es cero en los mismos casos quex && 1no 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-1para VERDADERO.truthcomo no valorada; con todo lo que no estrueserfalse. Todos los lenguajes de programación que conozco se vuelven lógicos formales, definiéndolosfalsecomo 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
booltipo Python es una subclase deint(por razones históricas; los booleanos solo se agregaron en Python 2.3).Como
int(True)es1,~Truees~1es-2.Ver PEP 285 para saber por qué
booles una subclase deint.Si quería el inverso booleano, use
not:Si quería saber por qué
~1es así-2, es porque está invirtiendo todos los bits en un entero con signo;00000001se convierte en1111110el cual en una firmado entero es un número negativo, ver el complemento a dos :donde el
1bit 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-2representación es10entonces por qué-firmar.10con 2'complemento entonces -ve?format(-2 % (1 << 32), "032b")format(-2 & ((1 << 32) - 1), "032b")~True == -2se no es sorprendente siTruelos medios1y los~medios bit a bit de inversión ...... siempre que
Truepuede ser tratado como un entero yEdiciones:
fuente
~no significa "complemento 2s".~significa "Inversión a nivel de bits"