Combinar dos bytes para formar un valor con signo (16 bits).
Quiero combinar dos bytes (8 bits)
para formar un valor firmado (un bit para el signo y 15 para el valor)
según el método del complemento a dos.
Recibo el byte más significativo (MSbyte)
(nota que el bit más a la izquierda del MSbyte representa el signo) y el byte menos significativo (LSbyte)
. Por lo tanto, escribo una función desplazando el MSbyte
a la izquierda en 8 bits
y luego lo sumo con el LSbyte
para formar una secuencia binaria de 16 bits
. Luego, calculo el complemento a uno
y finalmente le sumo 1 al resultado. Sin embargo, no funciona.
def twos_comp_two_bytes(msb, lsb):
a = (msb << 8) + lsb
r = ~(a) + 1
return r
Por ejemplo, 0b1111110111001001
es -567
, sin embargo, con la función anterior obtengo -64969
.
EDIT : Llamada a la función
twos_comp_two_bytes(0b11111101, 0b11001001) => -64969
davy.ai
Parece que hay un problema con la función, ya que no está produciendo el resultado esperado. Una posible razón es que los valores de entrada no están en el formato correcto. Es importante asegurarse de que los valores de entrada estén en formato de byte antes de realizar cualquier operación bitwise.
Otra posible razón es que la función no está manejando correctamente los números negativos en formato de complemento a dos. Una forma de hacer esto es verificar el bit más significativo de los valores de entrada y, si está establecido, realizar la conversión adecuada para obtener el valor negativo.
Aquí hay una versión actualizada de la función que debería funcionar:
Esta función primero convierte los valores de entrada al formato de byte utilizando el método
to_bytes()
. Luego combina los bytes en un entero de 16 bits utilizando el métodoint.from_bytes()
.Para valores negativos, verifica si el bit más significativo está establecido y, de ser así, realiza la conversión de complemento a dos restando el valor de
2^16
. Finalmente, devuelve el valor resultante como un entero firmado.Con esta función actualizada, los valores de entrada de ejemplo
0b11111101
y0b11001001
deberían producir el resultado esperado de-567
.