Autor Tema: Ayuda con INT16!!  (Leído 1849 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Shadowman

  • PIC10
  • *
  • Mensajes: 7
Ayuda con INT16!!
« en: 16 de Agosto de 2006, 21:45:04 »
Hola

·Tengo el siguiente problema, estoy implementado una función en apariencia muy sencilla: Tomando 2 bytes como argumento, tengo que implementar una multiplicación binaria. Explico con un ejemplo: b1 = b2 = 85d = 01010101b

     
                     01010101 x 01010101
                     01010101
                   01010101   
                 01010101   
               01010101       
            00001000100010001


·En el fondo: uno de los bytes se deja fijo; se revisa si el bit n-ésimo (n entre 0 y 7) es 0 ó 1; si es 0 se anota un cero, si es 1 se copia el 2º byte, desplazado n lugares (multiplicado por 2 n veces, según corresponda). Finalmente se realiza un XOR entre los números resultantes, obteniendose el resultado final, el cual es un entero de 16 bits.

·Mi gran problema ocurre cuando asigno los valores... por alguna razón el compilador asigna el valor al byte más alto... por ejemplo, 85 -> 01010101 se convierte en 0101010100000000... por ende, todos los resultados posteriores son erróneos... El código que generé para realizar esto es el siguiente:

Código: [Seleccionar]
int16 lmul(int b1,int b2)
{
int i,j;
int16 byte_array[8];
int16 aux;
long aux2;

if ((b1 == 0) || (b2 == 0))      //si b1 o b2 vale 0
   return 0;                     //devolver de inmediato un 0
else
{ // principio else
for(i=0;i<=7;i++)
  {
   if (bit_test(b1,i)==1)
      {
      aux2 = make16(0,b2);
      for(j=0;j<=i;j++)
         aux2 = aux2 * 2;
      byte_array[i] = aux2;
      }
   else
      byte_array[i] = 0;
  }

aux = byte_array[0];

for(i=0;i<=6;i++)
{
aux = aux ^ byte_array[i+1];
}

} //fin else

return aux;

}

·Si alguien me puede echar una mano, le estaría muy agradecido.

Atte.
Fernando

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Ayuda con INT16!!
« Respuesta #1 en: 16 de Agosto de 2006, 23:15:45 »
He hecho algunos cambios.Pruébalo a ver que tal va.

Código: C++
  1. int16 lmul(int b1,int b2)
  2. {
  3. int i,j;
  4. int byte_array[8];  // He cambiado el tipo base del array,no necesitas que sea de 16 bits
  5. int16 aux;
  6.  
  7. if ((b1 == 0) || (b2 == 0))      //si b1 o b2 vale 0
  8.    {
  9.    return 0;                     //devolver de inmediato un 0
  10.    }
  11. else
  12.    { // principio else
  13.    for(i=0;i<=7;i++)
  14.      {
  15.       if (bit_test(b1,i)==1)
  16.          {
  17.          byte_array[i] = b2;
  18.          }
  19.       else
  20.          {
  21.          byte_array[i] = 0;
  22.          }
  23.      }
  24.      
  25.       aux = (int16)byte_array[0];
  26.  
  27.       for(i=1;i<=7;i++)
  28.          {
  29.          aux = aux + (int16)(byte_array[i]*(2^i)); // Suma cada elemento desplazado y convertido a 16 bits
  30.          }
  31.  
  32.    } //fin else
  33.  
  34. return aux;
  35.  
  36. }
« Última modificación: 16 de Agosto de 2006, 23:25:08 por Modulay »

Desconectado Shadowman

  • PIC10
  • *
  • Mensajes: 7
Re: Ayuda con INT16!!
« Respuesta #2 en: 17 de Agosto de 2006, 00:06:11 »
Hola:

·Muchas gracias por tu respuesta, sin embargo, encontré el problema: la versión del compilador... me cambié a la versión 3.249 y el algoritmo funcionó sin problema...

Atte.
Fernando


 

anything