Python Language Bitwise NO


Ejemplo

El operador ~ volteará todos los bits en el número. Dado que las computadoras usan representaciones de números firmados , especialmente la notación de complemento de los dos para codificar números binarios negativos donde los números negativos se escriben con un (1) inicial en lugar de un cero (0).

Esto significa que si estuviera usando 8 bits para representar los números del complemento a dos, trataría los patrones de 0000 0000 a 0111 1111 para representar números de 0 a 127 y reservaría 1xxx xxxx para representar números negativos.

Números de ocho bits de complemento a dos

Bits Valor sin firmar Valor del complemento a dos
0000 0000 0 0
0000 0001 1 1
0000 0010 2 2
0111 1110 126 126
0111 1111 127 127
1000 0000 128 -128
1000 0001 129 -127
1000 0010 130 -126
1111 1110 254 -2
1111 1111 255 -1

En esencia, esto significa que mientras 1010 0110 tiene un valor sin signo de 166 (se obtiene al agregar (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0) ), tiene un valor de complemento a dos de -90 (se obtiene al agregar (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0) , y complementando el valor).

De esta manera, los números negativos varían hasta -128 ( 1000 0000 ). Cero (0) se representa como 0000 0000 , y menos uno (-1) como 1111 1111 .

En general, sin embargo, esto significa ~n = -n - 1 .

# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111
    
# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110

# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101

# 123 = 0b0111 1011
~123
# Out: -124
# -124 = 0b1000 0100

Tenga en cuenta que el efecto general de esta operación cuando se aplica a números positivos se puede resumir:

~n -> -|n+1|

Y luego, cuando se aplica a números negativos, el efecto correspondiente es:

~-n -> |n-1|

Los siguientes ejemplos ilustran esta última regla ...

# -0 = 0b0000 0000
~-0
# Out: -1 
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always
    
# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000

# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001

# -123 = 0b1111 1011
~-123
# Out: 122
# 122 = 0b0111 1010