Dezimalzahl in Binär Zahl umrechnen



  • In der Aufgabe wir verlang das ich ein Array benutze hab ich am Anfang vergessen zu sagen sry.

    Wie könnte ich die Aufgabe richtig lösen ?


  • Mod

    Ich will dir jetzt nicht deine Hausaufgaben machen, aber mal ein Beispiel als Anregung:

    Beispiel 13:
    - 13 enthält 0 mal 2^4=16 -> fünftletzte Stelle ist 0, Rest 13
    - 13 enthält 1 mal 2^3=8 -> viertletzte Stelle ist 1, Rest 5
    - 5 enthält 1 mal 2^2=4 -> drittletzte Stelle ist 1, Rest 1
    - 1 enthält 0 mal 2^1=2 -> vorletzte Stelle ist 0, Rest 1
    - 5 enthält 1 mal 2^0=1 -> letzte Stelle ist 1, Rest 0

    Ergebnis: 1101



  • SeppJ schrieb:

    Ich will dir jetzt nicht deine Hausaufgaben machen, aber mal ein Beispiel als Anregung:

    Beispiel 13:
    - 13 enthält 0 mal 2^4=16 -> fünftletzte Stelle ist 0, Rest 13
    - 13 enthält 1 mal 2^3=8 -> viertletzte Stelle ist 1, Rest 5
    - 5 enthält 1 mal 2^2=4 -> drittletzte Stelle ist 1, Rest 1
    - 1 enthält 0 mal 2^1=2 -> vorletzte Stelle ist 0, Rest 1
    - 5 enthält 1 mal 2^0=1 -> letzte Stelle ist 1, Rest 0

    Ergebnis: 1101

    Und eine Umsetzung mit "Array" könnte dann so aussehen:

    unsigned int number = 43;
    
    unsigned int length = static_cast<unsigned int>( log2f(number) + 1 );
    
    unsigned int * digits = new unsigned int[length];
    
    for(unsigned int i=0; i < length; i++, number /= 2) 	
        digits[length - i-1] = number % 2;
    
    delete[] digits;
    

    (Kurz zusammengehackt und ungetestet).
    Wenn du das Posting von SeppJ verstanden hast, solltest du auch meinen Code verstehen.



  • Naja irgendwie versteh ich da leider nicht viel von deinem Source Code das beispiel von SeppJ das hab ich zwar verstanden aber den Source Code versteh ich leider nicht 😞



  • dez schrieb:

    Naja irgendwie versteh ich da leider nicht viel von deinem Source Code das beispiel von SeppJ das hab ich zwar verstanden aber den Source Code versteh ich leider nicht 😞

    Na wenn du den "Algo" von SeppJ verstanden hast, dann kannst du ihn doch auch implementieren. (Was aber letztlich auch wieder auf meinen Code rauslaufen wird 😉 )

    PS: Du kannst das übrigens auch ganz einfach mit binärer Arithmetik lösen. Die Schleife könnte dann z.B. so aussehen:

    for(unsigned int i=0; i < length; i++)     
       digits[length - i-1] = number & (1 << i) ? 1 : 0;
    

    Du shiftest also einfach die 1 an die entsprechende Stelle und ver-UND-est sie mit der Zahl. Wenn dann ein Wert != 0 rauskommt, ist an der Stelle eine 1, sonst eine 0.



  • Naja danke erst mal für die tipps ich werd noch etwas rumprobieren.



  • bisschen overkilled 😃

    machs ganz eifnach

    int main()
    {
       int dec;
       cin >> dec;
    
       vector<int> a;
       binaer(a, dec)
       for(unsigned int i = size()-1; i > 0; --i)
          cout << a[i];
    }
    
    void binaer(vector<int> a, int dec)
    {
        while (dec != 0)
        {
           a.push_back( dec%2 );
           dec /= 0;
        }
    }
    

    ungefähr so...



  • Dein Code versucht das selbe zu machen wie meiner. Nur das er falsch ist 😉



  • #include <iostream>
    #include <string>
    using namespace std;
    
    // Deklaration
        int iEingabeDez, iBit, iSpeicher;
        string sDual;
    
    // Umrechnung einer Dezimalzahl in eine Dualzahl
    void dez2dual()
    {
         do
         {
         iBit = iEingabeDez%2;
         iEingabeDez /= 2;
         if (iBit == 1)
         sDual = "1" + sDual;
         else
         sDual = "0" + sDual;
         }
         while (iEingabeDez > 0);
    }
    
    int main()
    {   
        // Eingabeaufforderung
        cout << "-------------------------------------\nDezimalzahl in Dualzahl umwandeln\n-------------------------------------\n\n";
        cout << "Geben Sie eine Dezimalzahl ein:\t";
        cin >> iEingabeDez;
    
        // Für die spätere Ausgabe nötig
        iSpeicher = iEingabeDez;
    
        // Aufruf des Unterprogramms - Umrechnung
        dez2dual();
    
        // Ausgabe
        cout << "\n-------------------------------------\nDualzahl aus " << iSpeicher << ":\t";
        cout << sDual << "\n-------------------------------------\n\n\n";
    
    system("PAUSE"); 
    return 0;
    }
    

    Ist ein recht altes Programm von mir... sicherlich Anfängerfehler drin aber es funktioniert und ich denke es ist eins, was du verstehen wirst



  • root2k schrieb:

    #include <iostream>
    #include <string>
    using namespace std;
    
    // Deklaration
        int iEingabeDez, iBit, iSpeicher;
        string sDual;
    
    // Umrechnung einer Dezimalzahl in eine Dualzahl
    void dez2dual()
    {
         do
         {
         iBit = iEingabeDez%2;
         iEingabeDez /= 2;
         if (iBit == 1)
         sDual = "1" + sDual;
         else
         sDual = "0" + sDual;
         }
         while (iEingabeDez > 0);
    }
    
    int main()
    {   
        // Eingabeaufforderung
        cout << "-------------------------------------\nDezimalzahl in Dualzahl umwandeln\n-------------------------------------\n\n";
        cout << "Geben Sie eine Dezimalzahl ein:\t";
        cin >> iEingabeDez;
        
        // Für die spätere Ausgabe nötig
        iSpeicher = iEingabeDez;
        
        // Aufruf des Unterprogramms - Umrechnung
        dez2dual();
        
        // Ausgabe
        cout << "\n-------------------------------------\nDualzahl aus " << iSpeicher << ":\t";
        cout << sDual << "\n-------------------------------------\n\n\n";
       
    system("PAUSE"); 
    return 0;
    }
    

    Ist ein recht altes Programm von mir... sicherlich Anfängerfehler drin aber es funktioniert und ich denke es ist eins, was du verstehen wirst

    Naja, hat ja nichts mit Anfängerfehler zu tuen, da sind generell Fehler drinne. Globale Variablen? Du benutzt eine Funktion warum übergibst du ihr nicht den eingegeben Wert?



  • Wie gesagt, ein Programm von vor ca. 4 Jahren, da fing ich mit der Programmierung an, ich hab nicht mehr drüber geschaut.

    Hätte es jetzt vielleicht so gemacht:

    #include <iostream>
    #include <string>
    using namespace std;
    
    // Umrechnung einer Dezimalzahl in eine Dualzahl
    string convert(int dec)
    {
    	int bit;
    	string dual;
    
         do {
         bit = dec%2;
         dec /= 2;
         if (bit == 1) dual = "1" + dual;
         else dual = "0" + dual;
         }
         while (dec > 0);
    
    	 return dual;
    }
    
    int main()
    {  
    	// Deklaration
        int dec;
    
        // Eingabeaufforderung
        cout << "Geben Sie eine Dezimalzahl ein:\t";
        cin >> dec;
    
        // Ausgabe
        cout << endl << "Dualzahl aus " << dec << ":\t";
        cout << convert(dec);
    
        cout << endl << endl;
        return 0;
    }
    


  • Ich hab mal kurz ne Frage dazu:

    dez schrieb:

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    char bin[256];
    int i;
    int num;
    
    cout<<"Binaerzahl eingeben: ";
    cin>>bin;
    
            for ( wert = i = 0 ; bin [i] ; i++)
            {
            wert = wert * 2 + bin [i] - 48;
    
            }
    
    cout<<"Dezimalzahl: " << num << "\n";
    
    system("PAUSE");
    }
    

    kann mir jemand sagen, warum er in Zeile 17 ausgerechnet "-48" rechnen muss?



  • bin[i]-'0'
    stell dir vor, in bin[i] steht '5' und dann rechnsest du '5'-'0'. also die ascii-codes davon subtrahierst du.



  • Tut mir leid, ich habs noch nicht ganz...

    Wofür genau steht denn die 48? Für einen ascii Code?



  • Sandro L. schrieb:

    Tut mir leid, ich habs noch nicht ganz...

    Wofür genau steht denn die 48? Für einen ascii Code?

    Jop. Ist also ein Offset: (Kannst ja mal raten, was die 48 ist. ;))
    http://de.wikipedia.org/wiki/ASCII



  • Von der HEX30, da es in Zeile 3, Spalte 0 liegt. Da 3x16=48 sind, passt das^^

    Was genau versteht man unter Offset? 🙄
    Danke!



  • Sandro L. schrieb:

    Von der HEX30, da es in Zeile 3, Spalte 0 liegt. Da 3x16=48 sind, passt das^^

    Was genau versteht man unter Offset? 🙄
    Danke!

    Jop. Und jetzt schau mal, was in der ASCII-Tabelle für ein Zeichen dafür drin steht..;)

    Ein Offset ist ein Versatz. Die Zahlen sind ja um 48 verschoben. (versetzt). Also ist das der Versatz. (Offset).



  • Dann ist ja alles klar. Danke!


Anmelden zum Antworten