Cómo sumar dos números binarios

0

tengo dos números binarios

u8 buf[2];
buf[0] = 0001 1110; In dec it's 30 ; it is  High Byte and means 30 C;
buf[1] = 1100 0000; In dec it's 192 ; but its Low byte and means 0.75 C;

¿Cómo puedo devolver un valor de 30.75 C?

    
pregunta user3826752

2 respuestas

0

El punto radix está entre los dos bytes, como señala el jippie. Si desea convertirlo a punto flotante, puede hacer algo como esto (código C)

int nint; 
float num; 
nint = buf[0] << 8 | buf[1]; 
num = nint/256.0; 

Pero solo si el número está sin firmar Editar: un número positivo en el complemento de 2, por ejemplo, el msb de buf [0] es 0 como en su ejemplo.

Si el número tiene el complemento de 2 firmado, entonces tendrás que firmar y extender el entero utilizando algo como esto:

int nint; 
float num; 
nint = buf[0] << 8 | buf[1]; 
if (nint & (0x01 << 15))
   {
   nint = (~0 ^ 0xFFFF) | nint;  // sign extend 
   } 
num = nint/256.0;
    
respondido por el Spehro Pefhany
2

Tu número tiene un punto binario fijo. Esto significa que el byte bajo debe dividirse por 256 para obtener la fracción correcta. Lo que realmente significa es:

30 + 192/256 = 30 + 0.75 = 30.75

Este es un gran formato porque simplemente puedes usar las matemáticas enteras de la CPU con él, lo cual es simple y rápido. Solo cuando sea necesario para imprimir, debe convertirlo de forma que se respete el punto (binario). Solo para las multiplicaciones y divisiones necesitas cambiar el resultado para obtener la magnitud correcta. Piénsalo, esto es exactamente lo mismo que aprendiste en la escuela primaria con los números decimales.

Con el byte alto, el bit más a la derecha, bit0 tiene un peso de 2 0 = 1. El bit de la izquierda tiene un peso 2 1 = 2 y el bit al lado de ese 2 2 = 4 ... etc.

Los bits a la derecha, el byte bajo tienen los pesos 2 -1 = 0.5 y el bit a la derecha de esos 2 -2 = 0.25 ... etc . hasta 2 -8 = 1/256.

    
respondido por el jippie

Lea otras preguntas en las etiquetas