zfill funcion example bitwise array python bit-manipulation

python - funcion - operación de bits unario ~(invertido)



string to binary python (4)

Esta pregunta ya tiene una respuesta aquí:

Estoy un poco confundido por el ~ operador. El código va abajo:

a = 1 ~a #-2 b = 15 ~b #-16

¿Cómo funciona ~ do?

Pensé, ~a sería algo así como:

0001 = a 1110 = ~a

¿Por qué no?


El operador ''~'' se define como: "La inversión en bits de x se define como - (x + 1). Solo se aplica a números enteros". Python Doc - 5.5

La parte importante de esta oración es que esto está relacionado con ''números enteros'' (también llamados enteros). Tu ejemplo representa un número de 4 bits.

''0001'' = 1

El rango entero de un número de 4 bits es ''-8..0..7''. Por otro lado, podría usar ''enteros sin signo'', que no incluyen un número negativo y el rango para su número de 4 bits sería ''0..15''.

Dado que Python opera en enteros, se espera el comportamiento que describió. Los enteros se representan utilizando el complemento de dos. En el caso de un número de 4 bits, esto se parece a lo siguiente.

7 = ''0111'' 0 = ''0000'' -1 = ''1111'' -8 = ''1000''

Python usa 32 bits para la representación de enteros en caso de que tenga un sistema operativo de 32 bits. Puede verificar el número entero más grande con:

sys.maxint # (2^31)-1 for my system

En caso de que desee un número entero sin signo devuelto para su número de 4 bits, debe enmascararlo.

''0001'' = a # unsigned ''1'' / integer ''1'' ''1110'' = ~a # unsigned ''14'' / integer -2 (~a & 0xF) # returns 14

Si desea obtener un rango de números de 8 bits sin signo (0..255), simplemente use:

(~a & 0xFF) # returns 254


Parece que encontré una solución más simple que hace lo que se desea:

uint8: x ^ 0xFF uint16: x ^ 0xFFFF uint32: x ^ 0xFFFFFFFF uint64: x ^ 0xFFFFFFFFFFFFFFFF


También puede usar ints sin firmar (por ejemplo, del paquete numpy) para lograr el comportamiento esperado.

>>> import numpy as np >>> bin( ~ np.uint8(1)) ''0b11111110''


Tienes exactamente razón. Es un artefacto de representación entera de dos complementos .

En 16 bits, 1 se representa como 0000 0000 0000 0001 . Invertido, obtienes 1111 1111 1111 1110 , que es -2. Del mismo modo, 15 es 0000 0000 0000 1111 . Invertido, obtienes 1111 1111 1111 0000 , que es -16.

En general, ~n = -n - 1