Dualzahl zu Dezimal umrechnen brauche mal ein Tipp



  • Hallo ich bin noch Anfänger in C++ und muss ein Programm schreiben was duale Zahlen zu Dezimalzahlen umrechnet ohne String.

    Im Moment bin ich soweit, finde aber einfach keine Lösung die Ergebnisse zu addieren?

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main()
    {
    
       int64_t zahl, stellen, zwischen, ergeb;
    
       cout << "Bitte geben Sie eine duale Zahl ein mit max 16 Stellen: " <<endl;
       cin >> zahl;
       while (zahl>1111111111111111)
       {
    
           cin >> zahl;
       }
    stellen=0;
    
     do
       {
    zwischen=zahl%10;
    zahl=zahl/10;
    stellen++;
    ergeb=(zwischen*2)*exp2(stellen-2);
    
    cout << "zahl:   " << zwischen <<endl;
    cout << "stellen:  " << stellen << endl;
    cout << "ergebnis:  " << ergeb << endl;
    
    }
    while (zahl >0 );
    
        return 0;
    }
    


  • maxel22 schrieb:

    ohne String.

    Wenn du so int64_t benutzt, um so eine Dualzahl zu speichern, kannst du nicht mehr als 18 Bits verarbeiten. Das ist hoffentlich klar.

    std::int64_t gibt's auch erst dann, nachdem man <cstdint> (aus C++11) inkludiert. Alternativ kannst du long long verwenden, was auch garantiert mindestens 64 Bit breit ist.

    maxel22 schrieb:

    finde aber einfach keine Lösung die Ergebnisse zu addieren?

    Addieren kannst du mit dem + Operator. Das Problem hattest Du ja fast schon gelöst...

    ergebnis = 0;
    stellen = 0;
    while (zahl>0) {
        int bit = zahl % 10; // war dein "zwischen"
        assert(bit==0 || bit==1);
        zahl = zahl/10;
        ergebnis = ergebnis + zwischen << stellen;
        stellen++;
    }
    

    Tipp: Definiere Deine Variablen so lokal wie möglich. Die Variable bit habe ich hier z.B. in der Schleife definiert. Die Variable zwischen wird damit überflüssig.

    assert kommt aus dem <cassert> -Header und hilft bei der Code-Dokumentation und bei der Fehlersuche. Kann ich empfehlen.



  • Oh, da hat sich mindestens 1 Fehler eingeschlichen. Sollte in etwa so aussehen:

    ergebnis = 0;
    stellen = 0;
    while (zahl>0) {
        long bit = zahl % 10; // war dein "zwischen"
        assert(bit==0 || bit==1);
        zahl = zahl/10;
        ergebnis = ergebnis + (bit << stellen);
        stellen++;
    }
    

    Die Klammer bei (bit << stellen) ist wichtig, da + stärer bindet. Der Wert von (bit << stellen) ist bit * 2stellen. Es ist also sowas wie exp2 , nur dass exp2 ist ja für Flieskommazahlen. Das wäre hier etwas Overkill.

    Der Code ist immer noch nicht getestet. Die letzten Fehler findest Du. 😉



  • Und assert ist hier eigentlich auch die falsche Wahl, weil es sich ja nicht um einen Programmierfehler sondern eine fehlerhafte Eingabe vom Benutzer handelt. Da könnte man sowas draus machen:

    if (bit!=0 && bit!=1) {
          cout << "Fehlerhafte Eingabe! Keine Binärzahl!\n";
          return 0;
      }
    

    oder so.

    In größeren Programmen wickle ich Eingabefehler aber typischerweise über Ausnahmen ab. Das ist oft praktischer, weil man selten weiß, wie man an der Stelle, wo ein Fehler erkannt wurde, er behandelt werden soll.



  • Hallo

    Vielen Dank für die Tipps!


Anmelden zum Antworten