Dezimal zu Binär



  • Guten Tag, liebe Community.

    Ich habe die Aufgabe bekommen, ein Programm zu schreiben, welches eine eingegebene Dezimalzahl in eine Binärzahl umwandelt.

    Normalerweise, kein Thema.

    Allerdings sollten wir:

    NUR mit funktionaler Programmierung arbeiten (ergo: keine Schleifen, nur Rekursion und Funktionen).
    Die Binärzahl nicht in normaler Reihenfolge (auch Big-Endian-Format) sondern in umgekehrter Reihenfolge (!) ausgeben (auch Little-Endian).

    Beispiel:

    8 = 1000 (Big-Endian) = 0001 (Little-Endian)

    Nun erstmal mein Code:

    #include <iostream>
    using namespace std;
    
    																	//Errechnet die Binär-Zahl im Big-Endian-Format
    
    int DezToBin(int Dezimal)
    {
    	int Rest, Ergebnis = 0;
    
    	if (Dezimal == 0) {return 0;}									//Abbruchbedingung
    
    	if (Dezimal > 0)
    			{
    				Rest = Dezimal % 2;
    				Dezimal = Dezimal / 2;
    
    				return Ergebnis = Rest + 10*(DezToBin(Dezimal));	//Rekursion
    			}
    
    	return 0;
    }
    																	//Errechnet die Binär-Zahl im Little-Endian-Format
    int Umkehr(int Dezimal)
    {
    	int Rest, Ergebnis;
    
    	Ergebnis = DezToBin(Dezimal);									//Aufruf des Ergebnisses im Big-Endian-Format
    
    	if (Ergebnis == 0) {return 0;}									//Abbruchbedingung
    
    	if (Ergebnis != 0)
    		{
    				Rest = Ergebnis % 10;
    
    		        cout << Rest;
    
    		        return Umkehr(Ergebnis/10);							//Rekursion
    		}
    
    	return 0;
    }
    
    int main()
    {
       int Dezimal, Ergebnis;
    
    	cout << "Dezimal Zahl: " << endl;
    	cin >> Dezimal;
    
    	Ergebnis = Umkehr(Dezimal);										//Aufruf der Funktion Umkehr
    
        return 0;
    }
    

    Meine Idee war, da ich die Zahl nicht 'errechnen kann' (wegen der 0en), sie einzeln auszugeben.

    Die Funktion zur Berechnung der Zahl für sich(DezToInt), funktioniert.
    Die Umkehrfunktion funktioniert auch für Dezimal <= 3.
    Ab 4, bekomme ich nur noch die ersten beiden Stellen, dann Kauderwelsch.

    Ich habe das Gefühl, einen furchtbar dummen Fehler, schlichtweg zu übersehen, bin aber auch blutiger Anfänger ..

    Über Hilfe würde ich mich sehr freuen!

    Mit freundlichen Grüßen,
    Beeblebrox



  • Ach ja, und sollte ich hier falsch sein, tut mir das Leid .. will niemandes Zeit verschwenden.



  • Erstmal, was verstehst Du in diesem Zusammenhang unter einer "Dezimalzahl" und einer "Binärzahl"?

    Eine** int **Variable enthält ja erst mal einen Zahlenwert, der völlig unabhängig von einer bestimmten Darstellung (sei es nun als Dezimalzahl, als Hexadezimalzahl oder als Binär-String) ist.

    Intern, also im Arbeitsspeicher, sind die Daten letztendlich natürlich immer binär kodiert (im Zweierkomplement), niemals dezimal.

    So wie ich Deinen Code verstehe, versucht Du also den** int Wert so umzuformen, dass eine Darstellung als Dezimalzahl (zum Beispiel printf() mit %d **Platzhalter), einen Binär-String ergibt...

    Ist das richtig? 😕

    Es wäre für mich irgendwie naheliegender das ganze direkt als** string **zu lösen:

    static std::string IntToBin(const int input)
    {
    	if(input <= 0)
    	{
    		return "";
    	}
    
    	const int rest     = input % 2;
    	const int quotient = input / 2;
    
    	return IntToBin(quotient) + (rest ? '1' : '0');
    }
    
    static std::string Invert(const std::string input)
    {
    	if(input.empty())
    	{
    		return "";
    	}
    
    	const char head = input.front();
    	const std::string tail = input.substr(1);
    
    	return Invert(tail) + head;
    }
    
    int main(int argc, char* argv[])
    {
    	for(int i = 1; i < 32; i++)
    	{
    		 printf("%02d -> %5s -> %5s\n", i, IntToBin(i).c_str(), Invert(IntToBin(i)).c_str());
    	}
    	return 0;
    }
    

    Wenn Du unbedingt durchgehend mit** int **'s arbeiten willst, die erst ganz zum Schluss als String ausgegeben werden, könnte man das "Umkehren" z.B. so lösen:

    static int IntToBin(int input)
    {
    	if(input <= 0)
    	{
    		return 0;
    	}
    
    	const int rest     = input % 2;
    	const int quotient = input / 2;
    
    	return rest + 10 * IntToBin(quotient);
    }
    
    static int Digits(const int input)
    {
    	if(input <= 0)
    	{
    		return 0;
    	}
    
    	return 1 + Digits(input / 10);
    }
    
    static int Factor(const int input)
    {
    	if(input <= 0)
    	{
    		return 1;
    	}
    
    	return 10 * Factor(input - 1);
    }
    
    static int Invert(int input)
    {
    	if(input <= 0)
    	{
    		return 0;
    	}
    
    	const int head = input % 10;
    	const int tail = input / 10;
    
    	return head * Factor(Digits(tail)) + Invert(tail);
    }
    
    int main(int argc, char* argv[])
    {
    	for(int i = 1; i < 32; i++)
    	{
    		printf("%2d -> %5d -> %0*d\n", i, IntToBin(i), Digits(IntToBin(i)), Invert(IntToBin(i)));
    	}
    	return 0;
    }
    

Log in to reply