Schnelle Wandlung ASCII-HEX nach Binär



  • Ich weiß ehrlich gesagt auch nicht, ob wir den OT richtig verstanden haben.
    Er will ja noch seine Nippel verschieben 😉

    EDIT: Mir fällt mal auf, dass der Thread im ANSI-C Forum is. Ich tausch mal std::cout mit printf aus.



  • Vielen Dank für die vielen Antworten!

    Und special thanks to Don06, das muss ich unbedingt ausprobieren, sieht vielversprechend aus.

    👍



  • Ich wusste doch, dass ich da vor kurzem mal was gefrickelt hab. Etwas langsamer als das von Don06 dafür weniger Speicherbedarf (auch bei groß-und kleinbuchstaben) und ebenfalls keine range-checks.

    unsigned char hex2bin(const unsigned char x){
        const unsigned char nums[2][10] = { { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9 },
                                   { 0, 10, 11, 12, 13, 14, 15,  0,  0,  0 } };
    
        return nums[x>>6][x&0xF];
    }
    


  • Wie wäre es mit einem einfachen switch-case ?

    int HexCharToInt( char* c )
    {
    	switch ( *c )
    	{
    		case '0':	return 0;
    			// ...
    		case 'F':	return 15;
    	}
    	return -1;
    }
    
    int main()
    {
    	char c = 'F';
    	printf( "%d", HexCharToInt( &c ) );
    	return 0;
    }
    


  • Die Frage ist, in wie weit der Kompiler das optimiert. Es geht ja um Schnelligkeit.

    Wieso übergibst du den Char als Pointer?



  • damit der char nicht extra noch einmal kopiert wird



  • Vergiss das mit dem Pointer und deklariere die Funktion als inline . Und schau dir unbedingt mal den Assembler Code bei eingeschalteter Optimierung (gcc -O3 -S) an.

    just my 2¢



  • Pedobear schrieb:

    Vergiss das mit dem Pointer und deklariere die Funktion als inline . Und schau dir unbedingt mal den Assembler Code bei eingeschalteter Optimierung (gcc -O3 -S) an.
    just my 2¢

    inline,
    ist das ansi c ?



  • wo sind wir denn hier schrieb:

    inline,
    ist das ansi c ?

    Ja, es ist ANSI C99.

    just my 2¢



  • Rafti schrieb:

    ... Kennt jemand eine tolle und extrem schnelle Methode?

    void Hex_Bin_64k(char* tab);
    
    int main() 
    { 
        // Das schnellste waere eine Tabelle,
        char tabelle[256*256] ; // fuer zweistellige Hexadezimalzahlen 
        char test;
        // bei der die hexadezimale Schreibweise als Index auf den Binärwert agiert.
        // Es ist eine Funktion zu schreiben, die die entsprechenden Binärwerte 
        // unter Beruecksichtigung von Gross- und Kleinschreibung in die Tabelle schreibt,
        // oder eine "globale" resp. "static" Tabelle als Ressource,
        // die die Binärwerte an richtiger Stelle enthaelt.
        Hex_Bin_64k (tabelle);
    
        test = tabelle['0a'] ;
    }
    
    void Hex_Bin_64k(char* tab)
    {
        unsigned char binaer = 0;
        unsigned short i = 0;
        char tmp1, tmp2;
    
        do
        {
              tmp1 = (char)i;
              tmp2 = (char)(i>>8);
    
              if (((tmp1 >= '0' &&  tmp1 <= '9') ||
                   (tmp1 >= 'A' &&   tmp1 <= 'F')) 
                  &&
                   ((tmp2 >= '0' &&  tmp2 <= '9') ||
                   (tmp2 >= 'A' &&  tmp2 <= 'F')))
              { 
                  tab[i] = binaer;
                  tab[i+32] = binaer; // Kleinschreibung beruecksichtigen
                  binaer++;
              }
             i++;
    
        }while (i);
    }
    

    MfG


Anmelden zum Antworten