Practico 2) - Ejercicio 2)

Practico 2) - Ejercicio 2)

de Bruno Emanuel Gandos Telis -
Número de respuestas: 7

Hola, se me ocurrió el siguiente algoritmo para resolver este ejercicio pero no se si es correcto: 

short sumaBCD(char num1, char num2){

    short res_signo = 0x000F;

    short res_valor = num1 >> 4 + num2 >> 4;

    return res_valor << 4 + res_signo;

}

Yo aca asumi que los parámetros vienen con su ultimo nibble de la forma 1111 por que la letra dice que son enteros sin signo, por lo que el otro nibble restante seria el valor en si del numero. Por ejemplo: 14 = 1110 1111

En respuesta a Bruno Emanuel Gandos Telis

Re: Practico 2) - Ejercicio 2)

de Gustavo Brown -
Bruno,
La idea del ejercicio es considerar que los números de entrada (num1 y num2) son de 2 dígitos BCD sin tener en cuenta dígitos marcadores especiales de fin de cadena BCD ni signo. El largo de los números de entrada está predeterminado (0 a 99) y la salida tendrá 3 dígitos BCD y puede tomar valores entre 0 y 198, siendo cada dígito BCD.
Lo que tenés que tener en cuenta es que al sumar 2 dígitos BCD el resultado debe tener en cuenta el acarreo en BCD que se pasa al siguiente dígito si la suma es mayor a 9.
Por ejemplo, si la entrada fuese 0x08 y 0x03 el resultado debe ser 0x011. Si la entrada fuese 0x90 y 0x22 el resultado debería ser 0x112

Saludos,
Gustavo
En respuesta a Gustavo Brown

Re: Practico 2) - Ejercicio 2)

de Amalia Lucia Balestrazzi Silveira -

Buenas,
Queria preguntar si lo que hice viene bien. Mi funcion es la siguiente:

int sumaBCD(char num1, char num2) {
  int u1 = num1 & 0x0f;
  int d1 = (num1 >> 4) & 0x0f;
  int u2 = num2 & 0x0f;
  int d2 = (num2 >> 4) & 0x0f;
  int sumU = u1+u2;
  int carry = sumU/10;
  int r = sumU%10;
  int sumD = d1+d2+carry;
  return sumD*10+r;
}

Va por ahi la cosa?

Gracias!


En respuesta a Amalia Lucia Balestrazzi Silveira

Re: Practico 2) - Ejercicio 2)

de Federico Rivero -
Hola Lucía,

Viene bien! Lo que veo es que el resultado lo estás devolviendo en decimal, y la idea es que también vuelva en BCD. Esto te agrega 2 cosas:

1) En la columna de las decenas tenés que tener el mismo cuidado que en las unidades (si el dígito es >= 10, hay que ajustarlo)
2) Al armar la tira final, hay que tener cuidado de que cada dígito quede en sus 4 bits correspondientes (para esto te conviene usar la operación shift left << )

Saludos!
Federico
En respuesta a Gustavo Brown

Re: Practico 2) - Ejercicio 2)

de Bruno Emanuel Gandos Telis -
Gracias Gustavo, se me ocurrio el siguiente programa ahora:


 
short sumaBCD(char num1, char num2){
char num2_inferior = num2 & 0x0F;
char num1_inferior = num1 & 0x0F;
char num2_superior = num2 >> 4;
char num1_superior = num1 >> 4;
short res_inferior, res_superior;
char carry;
if(num1_inferior + num2_inferior >= 10){
res_inferior = num1_inferior + num2_inferior -10;
carry = 1;
}
else{
res_inferior = num1_inferior + num2_inferior;
carry = 0;
}
res_superior = num1_inferior + num2_superior + carry;
return res_inferior + res_superior << 4;

Es correcto? Gracias
En respuesta a Bruno Emanuel Gandos Telis

Re: Practico 2) - Ejercicio 2)

de Bruno Emanuel Gandos Telis -
Correcion: la linea anterior al return deberia decir: res_superior = num1_superior + num2_superior + carry;
En respuesta a Bruno Emanuel Gandos Telis

Re: Practico 2) - Ejercicio 2)

de Federico Rivero -
Hola Bruno!

Está cerca. Al dígito de las decenas (res_superior) también tendrías que hacerle el mismo tratamiendo que al de las unidades. Si es >= 10, deberías ajustarlo y agregar un 1 en las centenas.

Saludos!
Federico