Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Parser hexadecimal - CordayUK

Iniciado por ethernet, 23 de Febrero de 2003, 05:28:07 PM

« anterior - próximo »

Zaelsius

El artículo en cuestión del Programming Gems 2 era sobre el uso de optimizaciones al usar floats y tablas de senos, etc. Ahora no tengo el libro, pero creo que era de un tal Yossarian King, programador de EA en canadá(creo).

Aunque últimamente no me gustan mucho la política de videojuegos de EA...

Interlink

                                Hola. Creo que el problema de convertir un string que representa un valor
hexadecimal a su correspondiente valor numérico ha quedado bastante claro en el foro, de todas formas aquí os envio mi pequeña aportación que supongo sería útil.

He partido de la idea de la composición numérica de base-n, basada en la
sucesión: c1*b^0 + c2*b^2 + .... + ci*b^(i-1)
Luego he creado dos versiones de la función, una recursiva que es más lenta pero mas reducida y otra no recursiva. El código es el siguiente:




#include <iostream.h>

#include <string.h>



#define __CHAR2BYTE(c)    ((c) >= '0' && (c) <= '9' ? (c) - '0' : (c) - 55)



typedef unsigned long DWORD;



DWORD power16(int i){

     if (i==0) return 1;

     return 16*power16(i-1);

}



DWORD recursiva(char *str, int i, int c = 0){

     DWORD hex_val = __CHAR2BYTE(str[c]);

     if (i==1) return hex_val;

     return hex_val*power16(i-1)+recursiva(str,i-1,c+1);

}



DWORD nopower16(int i){

     DWORD power = 1;

     for (int n=0;n<i;n++)

           power*=16;

     return power;

}



DWORD norecursiva(char *str,int i){

DWORD hex_delta = 0,hex_val;

for (int n=i-1;n>=0;n--){

 hex_val = __CHAR2BYTE(str[n]);

 hex_delta+=hex_val*nopower16(i-n-1);

}

return hex_delta;

}



int main(int argc, char* argv[])

{

      cout << "Valor decimal(R):" << recursiva(argv[1],strlen(argv[1]));

      cout << "nValor decimal(NR):" << norecursiva(argv[1],strlen(argv[1]));

      return 0;

}



                               

Mars Attacks

                                Curiosa forma de presentarse ;) Bienvenido seas XD                                

Interlink

                                                               

Interlink

                               
Cita de: "Interlink"Gracias Mars!  :ojo:

Mars Attacks

                                Cuando te he saludado aún no habías puesto tu código. Antes me caías bien, ahora me caes mejor XD
Alguien que no teme a la recursividad es un tío serio. Aunque creo que con algún problema con ¿el navegador? a la hora de poner posts :)                                

Interlink

                                Mars, no conocía muy bien el editor!  :I  
Esta versión recursiva es más optimizada aún ya que los desplazamientos
consumen menos ciclos de CPU.



DWORD recursiva(char *str, int i){

     if (i==1) return __CHAR2BYTE(str[i-1]);

     return (__CHAR2BYTE(str[i-1]) | recursiva(str,i-1)<<4);

}



Un saludo                                

CordayUK

                                COOL !                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.