es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for 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:

    def twos_comp_two_bytes(msb, lsb):
        # convertir las entradas al formato de byte
        msb = msb.to_bytes(1, byteorder='big', signed=False)
        lsb = lsb.to_bytes(1, byteorder='big', signed=False)
    
        # combinar los bytes en un entero de 16 bits
        val = int.from_bytes(msb + lsb, byteorder='big', signed=True)
        # realizar la conversión de complemento a dos para números negativos
        if val < 0:
            val = (1 << 16) + val
    
        return val
    

    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étodo int.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 y 0b11001001 deberían producir el resultado esperado de -567.

Comments are closed.