Hexadezimalzahl -> Dezimalzahl



  • du meinst das mit der variablen anzahl ziffern?
    wie wärs den mit einer variabel, die bei jeder neuen ziffer hochgezählt wird? (do-while schleife z.B.)



  • hatte ich auch schon dran gedacht.
    das es 8 unterschiedliche fälle gibt. also wenn zählervariable 1 ist, dann wertigkeit 16^0 wenn 2 dann erste zahl 16^1 und zweite zahl 16^0... so meinst du das doch oder ?
    gibt es da noch eine elegantere lösung?



  • 3F = 3 * 16^1 + F *16^0
    Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.



  • BuddyHolly schrieb:

    3F = 3 * 16^1 + F *16^0
    Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.

    ausgehend von dem code weiter oben:

    unsigned long hexstring_to_number (char *str)
    {
        unsigned long res = 0;
        while (*str)
        {
            char c = *str++;
    
            if (c > '9')
                c = (c&0xdf) - 'A' + 10;  // buchstaben ergeben 10...X
            else
                c -= '0';                 // zahlen ergeben 0...9
            if (c > 15)
            {
                // fehleingabe
                // muss irgendwie behandelt werden
            }
            else
            {
                // okay (0<=c<=15)
                res = (res<<4) + c;
            } 
        }
        return res;
    }
    


  • ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?



  • tim-buktu schrieb:

    ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?

    jede hexziffer steht für 4 bits (0x0 == 0000, 0xf == 1111).
    'res' akkumuliert diese bits. für jede neue ziffer (eine stelle mehr) wird res erstmal 4 mal links geschoben (entspricht einer multiplikation mit 16) und dann kommen die neuen 4 bits an die frei gewordenen stellen...
    :xmas2:

    testing...



  • tim-buktu schrieb:

    ich hab mal wieder was nich ganz verstanden.🙄
    was bewirkt die variable res ?
    und warum wird sie um 4 bit nach links verschoben?

    Egal. Machst doch ganz einfach

    summe = 0
    Text von hinten her durchgehen {
      wenn textzeichen bei aktueller position zwischen '0' und '9'
       summe += (textzeichen bei aktueller position - '0') * 16^(länge-position)
      sonst das selbe mit 'a' bis 'f'
    }
    

    Dann brauchst du auch nix schieben.



  • ten schrieb:

    res = (res<<4) + c;
    

    Mach doch aus dem + noch ein | dann wirds noch elitärer 😉



  • TactX schrieb:

    ten schrieb:

    res = (res<<4) + c;
    

    Mach doch aus dem + noch ein | dann wirds noch elitärer 😉

    stimmt. grundrechenarten und bitoperationen gemischt sieht doof aus 😞



  • ah, super, ich glaub ich hab beides jetzt verstanden,
    werde aber erst einmal das umsetzen:

    summe = 0
    Text von hinten her durchgehen {
      wenn textzeichen bei aktueller position zwischen '0' und '9'
       summe += (textzeichen bei aktueller position - '0') * 16^(länge-position)
      sonst das selbe mit 'a' bis 'f'
    }
    

    und wenn das super geklappt hat und ich noch zeit habe,mach ich mich an die meiner meinung nach kompliziertere variante 🙂
    bin mal gespannt ob ich morgen vormittag genug zeit dafür habe. hab mich in das thema zeiger noch nicht so ganz reingelesen, deshalb könnte es sein, das ich diesbezüglich ein paar schwierigkeiten bekomme und mich noch mal melde, ansonsten schon mal vielen vielen dank !



  • char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 24; j++)
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
                }
             printf("Fehler in Hexzahl!");
             break;
        }
    

    :xmas1: 🕶



  • verfluchte fehler

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0, j; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {            
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    

    😃



  • spagetti schrieb:

    zahl |= dectab[j];
    
    zahl |= (j%16 + j/16*10);
    

    :xmas2:



  • hmmm, ich bekomms nicht hin...
    ich scheitere schon bei der eingabe von der hexzahl.
    welche variable wird für die eingabe genutzt, und wie sieht da die syntax aus?
    wenn ich etwas mit

    gets ( variable );
    

    mache, spuckt er mir einen fehler beim compilieren aus.
    könntet ihr mir ne erklärung zu den verwendeten variablen geben, ich verstehe es leider einfach nicht 😞 daher schaff ichs auch nich das "drum herrum" zu programmieren.
    achja und ein frohes neues wünsche ich 🙂



  • tim-buktu schrieb:

    gets ( variable );
    
    char variable[256];
    gets (variable);
    

    aber vorsicht,
    nicht mehr als 'sizeof(variable)-1' zeichen eingeben, weil 'gets' nicht weiss wieviel platz da ist...
    :xmas2:



  • Ohne den Code wie du variable definiert hast können wir nichts sagen. Die Fehlermeldungen gehören auch zu einer ordentlichen Problembeschreibung.
    Außerdem ist gets() eh nicht gut. fgets() sollte für Eingaben benutzt werden. Ein einfaches Beispiel für die Benutzung von fgets liefer ich dir sogar:

    #include <stdio.h>
    
    #define BUFF_MAX 64
    
    int main(void){
        char buffer[BUFF_MAX];
        fgets(buffer, BUFF_MAX, stdin);
        puts(buffer);
        return 0;
    }
    


  • nun ja, ich wollte es jetzt mit diesem code umsetzten

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0, j; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {            
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    

    aber ich verstehe ihn leider nicht wirklich 😞
    wie muss ich den code abändern, damit ich eine eingabe machen kann bzw. auch wieder die richtige dezimalzahl ausgegeben wird...also welche variable wird dazu genutzt? ist das hextab[] oder hex[] ? 😕 ich hätte nich so viel feiern sollen an den feiertagen, ich glaub das hat mir das gehirn zermatscht 🙄



  • hmmm also, so langsam steige ich doch dahinter...
    das problem an dem programm bisher ist nur, das wenn ich nur eine ziffer eingebe, das der hinter diese ziffer nullen stellt, also praktisch die maximale wertigkeit für diese eine ziffer nimmt, wobei er dabei glaub ich auch en rechnen fehler hat(glaube ich jedenfalls). hab den code mal so abgeändert:

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    char hex[256] = "ffffffff";
    unsigned long zahl = 0,i,j;
    gets (hex);
    
        for ( i = 0 ; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |=(j%16 + j/16*10);
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    
        puts(hex);
        printf("%li",zahl);
    
        getch();
    

    wie bekomm geht das, das der wenn ich nur eine ziffer eingebe, die kleinste wertigkeit dafür nimmt, sprich die vorderen 7 stellen mit 0en füllt?



  • machs so

    #include <stdio.h>
    #include <string.h>
    int main()
    {
    const char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'}; 
    const int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15}; 
    
    char hex[256]; 
    
    unsigned long zahl = 0;
    size_t i, j; 
    
        gets (hex); 
    
        for ( i = 0 ; i < strlen(hex) && i < 8; i++) 
        { 
    
            for (j = 0; j < 24; j++) 
            { 
                if (hex[i] == hextab[j]) 
                { 
                    zahl <<= 4; 
                    zahl |= dectab[j]; 
                    break; 
    
                } 
            } 
            if (hex[i] != hextab[j]) 
            { 
                printf("Fehler in Hexzahl!"); 
                //break; 
                return 0;
            } 
        } 
        if (strlen(hex) >= 8) printf("Fehler Hexzahl hat mehr als 8 Stellen!"); 
        else
            printf("%li\n",zahl); 
    
        return 0;
    }
    

    🕶



  • dankö, so meinte ich es.
    verstehe nur 2 zeilen nicht 100%ig

    size_t
    

    wozu braucht man das ?
    und

    i < strlen(hex)
    

    ansonsten ist der code ja fast gleich dem von vorher.

    aufgabe 2 hab ich mitlerweile auch fertig.

    #include <stdio.h>
    #include <conio.h>
    void main()
    {
    int awahl;
    
    do
    {
    int a[5]={ 0,0,0,0,0},b[5]={ 0,0,0,0,0},tmp[6]={ 0,0,0,0,0,0},i;
    clrscr();
    printf("Menupunkt 1:\tSkalarprodukt berechnen\n");
    printf("Menupunkt 0:\tEnde");
    printf("\n\nBitte geben Sie einen Menupunkt ein: ");
    scanf("%i",&awahl);
    
    switch (awahl)
    {
    	case 1:
       {
       clrscr();
    
    for (i=0;i<5;i++)
    {
    	printf("Bitte geben Sie a%i ein: ",i);
       scanf("%i",&a[i]);
    }
    for (i=0;i<5;i++)
    {
    	printf("Bitte geben Sie b%i ein: ",i);
    	scanf("%i",&b[i]);
    }
    clrscr();
    for (i=0;i<5;i++)
    {
    	tmp[i]=a[i]*b[i];
       printf("Produkt aus a%i und b%i ist: %i\n",i,i,tmp[i]);
       getch();
    }
    tmp[6]=tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5];
    printf("\n\nDas Skalarprodukt ist: %i",tmp[6]);
    getch();
    break;
    }
    
    	case 0:
       {
       clrscr();
       printf("Ende");
       break;
       }
    	default:
       {
       clrscr();
       if (awahl!=1 && awahl !=0)
       {printf("Falsche Eingabe");
       getch();
       break;
       }
       }
       }
    }while(awahl!=0);
    
    }
    

    jemand was dran auszusetzen ? 😃


Anmelden zum Antworten