Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - Interlink

#1
Código de la Semana / Optimización
04 de Marzo de 2003, 11:35:29 AM
                                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                                
#2
Código de la Semana / Parser hexadecimal - CordayUK
03 de Marzo de 2003, 10:30:07 PM
                               
Cita de: "Interlink"Gracias Mars!  :ojo:
#3
Código de la Semana / Parser hexadecimal - CordayUK
03 de Marzo de 2003, 10:22:40 PM
                                                               
#4
Código de la Semana / Parser hexadecimal - CordayUK
03 de Marzo de 2003, 09:42:45 PM
                                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;

}



                               





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.