Konvertieren von Dez zu Binär und Hex mit C!!



  • Hi Leute,

    gibt es einen Befehl mit der ich die Zahlen umwandeln kann oder muss ich über die Division gehen?
    Das Programm soll aus einer Dezimalzahlals Binär- und als Hexadezimalzahl ausgeben!

    Grüße
    Marcel



  • Im Speicher ist alles Binärkodiert, musst nicht verwandeln. Oder meinst du die Darstellung auf dem Bildschirm? Dafür gibt es keine Standardfunktion.



  • #include <stdio.h>
    
    int main()
    {
      int a = 12345;
    
      printf ("Dezimal: %u.\n", a);
      printf ("Hexadezimal: %X.\n", a);
    }
    

    Damit kannst du die Zahl als Hexadezimalzahl darstellen lassen. Wenn du die Zahl binär darstellen willst, musst du dir denke ich eine eigene Funktion schreiben.



  • Nö, dafür gibts auch Möglichkeiten:

    char s[256];
      int i=5;
      itoa(i,s,2);  //bei itoa kannst du die gewünschte Basis (hier 2) angeben
      printf(s);
      getchar();
    


  • Ich muss es allerdings so in ein Programm einbetten, dass ich im Dos die Dezimalzahl eingebe und nicht in dem Quellcode!
    Aber danke für die Antworten!



  • itoa() ist kein Standard C.



  • Timauchmalloggedoff schrieb:

    itoa() ist kein Standard C.

    Hmm, na gut, wusste ich nicht. Dann gibts im Standard keine direkte Möglichkeit?

    @marcels87: Ist doch kein Problem. Ob du jetzt einen konstanten Wert im Quellcode zuweist, oder einen Wert einliest, macht doch letztlich keinen Unterschied...



  • Hatte bzw Habe das selbe Problem mal das ich eine Hex Zahl die in der eingabe durch ein H vor der Hexzahl angegeben wurde in Dez gewandelt wird und wieder zurückgegeben wird.

    hab das mal so Probiert gehabt:

    // Mein Hex Rechner___
    char * my_hex(char * dez, const char * hex)
    {
    	int stellenwert = 0;
    	double basis = 16;
    	int merk = 0;
    	double erg;
    	for(int i = 0; hex[i] != '\0';i++)
    	{
    
    		if (hex[i] == 'h' || hex[i] == 'H')
    		{
    			int j = i;
    			do
    			{
    				stellenwert = stellenwert + 1;
    				j++;
    
    			}while(isxdigit(hex[j]));
    		}
    
    		//	for(int k = stellenwert; stellenwert >= 0; stellenwert--)
    			//{
    				//if (isdigit(hex[i]))
    				//	merk = hex[i];
    				if (hex[i] == '0')
    					merk = 0;
    				else if (hex[i] == '1')
    					merk = 1;
    				else if (hex[i] == '2')
    					merk = 2;
    				else if (hex[i] == '3')
    					merk = 3;
    				else if (hex[i] == '4')
    					merk = 4;
    				else if (hex[i] == '5')
    					merk = 5;
    				else if (hex[i] == '6')
    					merk = 6;
    				else if (hex[i] == '7')
    					merk = 7;				
    				else if (hex[i] == '8')
    					merk = 8;				
    				else if (hex[i] == '9')
    					merk = 9;
    				else if (hex[i] == 'A' || hex[i] == 'a' )
    					merk = 10;
    				else if (hex[i] == 'B' || hex[i] == 'b' )
    					merk = 11;
    				else if (hex[i] == 'C' || hex[i] == 'c' ) 
    					merk = 12;
    				else if (hex[i] == 'D' || hex[i] == 'd' )
    					merk = 13;
    				else if (hex[i] == 'E' || hex[i] == 'e' )
    					merk = 14;
    				else if (hex[i] == 'F' || hex[i] == 'f' )
    					merk = 15;
    
    				dez[i] = (merk * pow(basis, stellenwert));
    				stellenwert = stellenwert -1;	
    	}
    	return dez;
    }
    

    Funktioniert bei mir noch nicht ganz ich weiß noch nicht ganz woran es liegt aber vielleicht siehst du ja einwenig den möglichen Ablauf vielleicht hilft dir das weiter.

    Oder jemand anderes weiß noch wies besser geht vl auch in Bezug auf meinen Quellcodeausschnitt ein verbesserungsvorschlag :xmas2:

    Also dann

    Frohes schaffen!

    Gruß



  • in Bezug auf meinen Quellcodeausschnitt ein verbesserungsvorschlag

    Wenn Du hinten anfaengst kannst Du auf pow() verzichten und einfach die Basis auf den Stellenwert (initial 1) multiplizieren.

    Da die Ascii-Darstellung der Hexadezimalziffern aufsteigend ist, koennte man die Ziffernumrechnung anstatt der if..else-Konstruktion zb per binaerer Suche loesen:

    char hex2dec(char c)
    {
      char *hexmap="0123456789ABCDEF";
      int l= 0;
      int r= 15;
      int m;
      while (l<r)
      {
        m= (l+r)>>1;
        if (c>hexmap[m])
          l=m+1;
        else
          r=m;
      }
      return l;
    }
    

    (setzt uppercase voraus)



  • Timauchmalloggedoff schrieb:

    itoa() ist kein Standard C.

    dann nimm strol, strtoul oder sowas. irgendwas davon ist 'ne standardfunktion.
    🙂



  • hellihjb schrieb:

    koennte man die Ziffernumrechnung anstatt der if..else-Konstruktion zb per binaerer Suche loesen:

    bist du informatiker oder sowas? ein 'if' ist doch nicht schlecht:

    char hex2dec(char c)
    {
      c = toupper(c) - '0';
      if (c <= 9)
        return c;  
      return c + '0' - 'A' + 10;
    }
    

    🙂



  • ~fricky schrieb:

    Timauchmalloggedoff schrieb:

    itoa() ist kein Standard C.

    dann nimm strol, strtoul oder sowas. irgendwas davon ist 'ne standardfunktion.
    🙂

    Ja, aber das wären Alternativen zu atoi, nicht itoa...



  • _matze schrieb:

    Ja, aber das wären Alternativen zu atoi, nicht itoa...

    ach, ich blindfisch! na, dann eben 'sprintf'.
    🙂



  • ~fricky schrieb:

    _matze schrieb:

    Ja, aber das wären Alternativen zu atoi, nicht itoa...

    ach, ich blindfisch! na, dann eben 'sprintf'.
    🙂

    Richtig, du Blindfisch! 😃 😉

    Und wie wandelt man nach binär um mit sprintf?



  • _matze schrieb:

    Richtig, du Blindfisch!

    ich muss zugeben, dass ich den thread nur stückchenweise gelesen habe.
    🙂



  • Ninja also bei meinem Code Beispiel war wie ich jetzt weiß diese Stelle Falsch (Denkfehler zu einfach gedacht):

    dez[i] = (merk * pow(basis, stellenwert));
    

    ich muss das Erg mit dem nächsten Addieren und dem nächsten dazu und so weiter... und dann das gesammtergebniss in dez[i] position für Postition packen...

    ansonsten der Vorgang die Rechnung bis dahin ist nicht falsch...

    gruß



  • noch ne Frage ... also es gibt ja isxdigit und so... damit überprüfe ich auf 0-9 A-F so nun soll bei HExa wenn ein G-Z eingegeben wurde ein Fehler kommen... gibt es sowas wie isnotxdigit oder so? ^^



  • Virokams schrieb:

    noch ne Frage ... also es gibt ja isxdigit und so... gibt es sowas wie isnotxdigit oder so? ^^

    lies deine frage mal selbst, dann weisst du gleich die antwort.
    🙂



  • ~fricky schrieb:

    Virokams schrieb:

    noch ne Frage ... also es gibt ja isxdigit und so... gibt es sowas wie isnotxdigit oder so? ^^

    lies deine frage mal selbst, dann weisst du gleich die antwort.
    🙂

    !isdigit als Beispiel? XD

    Ich hammel... sry


Anmelden zum Antworten