Dezimalzahlen in Binär (Gelöst)



  • Guten Tag Leute.
    Ich habe ein Problem. Un zwar hab ich als Übung versucht Dezimalzahlen als Binärcode auszugeben, dabei wollte ich nur die Möglichkeiten benutzen die ich bis jetzt bei meinem Lehrmaterial erhalten habe, also nur if-else, switch und schleifen. Bei Positiven Zahlen funktioniert alles, aber bei den Negativen funktioniert irgendwie nichts. Ich weiß es gibt sicher unendlich Möglichkeiten dies zu bewerkstelligen, Tipps sind gerne gewünscht,aber in erster Linie würde ich gerne meine Fehler gezeigt bekommen. Ab else geht es mit den Versuch los die negativen Dezimalzahlen in Binär umzuformen. Dazu habe ich die größt mögliche Int zahl genommen und dies durch die negative Benutzereingabe subtrahiert, da das Ergebnis ja dann den gleichen Binärcode wie das der negativen Benutzereingabe hätte. Das positive Ergebnis lasse ich dann durch das gleiche Prozedur durch, die ich für positiven Benutzereingabe geschrieben habe, aber obwohl es der gleiche code ist funktioniert es ab else irgendwie nicht. Falls ihr euch fragt warum ich variablen binär 1 bis 4 habe und diese alle mit 9 beginnen, dann weil ich keine andere Möglichkeit gesehen habe wie ich das anders bewerkstelligen sollte ^^.

    Naja lange Rede kurzer Sinn. Hier mal mein Code

    #include<iostream>
    using namespace std;
    
    main(){
    
    	long long eingabe;
    	int fall = 1;
    	int binar1 = 900000000;
    	int binar2 = 900000000;
    	int binar3 = 900000000;
    	int binar4 = 900000000;
    	int wiederholung = 10000000;
    
    	cout<<"Geben sie eine Zahl zwischen 2147483647 und - 2147483648 ein"<<endl;
    	cin>>eingabe;
    
    	if(eingabe >= 0){
    		for(long long x = 2147483648; x >= 1; x /= 2 ){
    
    			if(eingabe >= x){
    				eingabe -= x;
    				switch(fall){
    					case 1		:	binar1 += wiederholung; break;
    					case 2		:	binar2 += wiederholung; break;
    					case 3		:	binar3 += wiederholung; break;
    					case 4		:	binar4 += wiederholung; break;
    					default		: 	cout<<"irgendetwas ist schief gelaufen!!!"<<endl; break;
    				}
    
    				if(eingabe == 0){
    					break;
    				}
    			}
    
    			if(wiederholung  == 1){
    				wiederholung = 100000000;
    				fall = fall + 1;
    			}
    
    				wiederholung /= 10;
    		}	
    
    	}else{
    		eingabe = 4294967296 - eingabe;
    		for(long long x = 2147483648; x >= 1; x /= 2 ){
    
    			if(eingabe >= x){
    				eingabe -= x;
    				switch(fall){
    					case 1		:	binar1 += wiederholung; break;
    					case 2		:	binar2 += wiederholung; break;
    					case 3		:	binar3 += wiederholung; break;
    					case 4		:	binar4 += wiederholung; break;
    					default		: 	cout<<"irgendetwas ist schief gelaufen!!!"<<endl; break;
    				}
    
    				if(eingabe == 0){
    					break;
    				}
    			}
    
    			if(wiederholung  == 1){
    				wiederholung = 100000000;
    				fall = fall + 1;
    			}
    
    			wiederholung /= 10;
    		}
    	}
    	cout<<binar1<<" "<<binar2<<" "<<binar3<<" "<<binar4;
    }
    


  • GorillaHoden schrieb:

    eingabe = 4294967296 - eingabe;

    Was passiert denn, wenn man eine negative Zahl abzieht?



  • Wenn du zum beispiel als eingabe -100 hast, also den binärcode davon wissen willst, dann wird 4294967296 - 100 genommen. Denn 4294967196( = 4294967296 - 100) hat den selben binärcode wie - 100.



  • Außerdem braucht man keine Fallunterscheidung, wenn man für die Schleife nur unsigned verwendet:

    long eingabe;
    
    cin >> eingabe;
    
    unsigned long value = eingabe;
    

    Den Rest deines Algos verstehe ich aber nicht...
    Es geht aber auf jeden Fall einfacher, indem du innerhalb der Schleife '0' oder '1' ausgibst.



  • Tatsache hast recht für wenn ich unsigned verwende, der code sollte am anfang halt zwischen minus und plus unterscheiden, da ich ein anderen Algo vorgesehen habe, bis ich festgestellt habe dass -100 = 4294967196( = 4294967296 - 100) den selben binärcode haben. Ich wollte das erstmal so testen bevor ich was an dem funktionierenden Teil verändere ^^. Ich versuch mal den Rest deutlicher zu erklären^^. Ich nehme mal als beispiel bei der eingabe 127. Ich habe den code in 8er Schleifen durchlaufen lassen. er Testet

    passt 128 in die 127? Nein            währenddessen ist  wiederholung = 10000000
    
    da es nicht passt passiert nichts und ich kann sicher sein, dass an der ersten stelle des binärs keine 1 hinkommen würde. Nun kann ich die zweite stelle kontrollieren 10000000 / 10 = 1000000 ( die zweite stelle).
    
    passt 64 in die 127? Ja                (9)00000000 + 1000000 = (9)0100000
    127 -64 = 63                           1000000 / 10 = 100000 ( dritte stelle)
    
    passt 32 in die 63? ja                 (9)01000000 + 100000 = (9)01100000
    

    Und so weiter. ich hoffe ich konnte es irgendwie verständlich machen.
    Falls du dich fragst warum noch switch und überall ne 9 am anfang? ich konnte keine 32 Stellige Zahl ausgeben und hab die unterteilt in 4 * 8 und eine 9 am anfang gesetzt, da wenn ein zahl mit 0 anfangen würde (0001010), dann würden die ersten nullen gelöscht werden. Ich hätte das auch mit einem String gescheiter lösen können, aber in meinem Buch hatte ich bis jetzt nichts mit Strings zu tuhen und ich wollte nur so viel benutzen wie bis jetzt gegeben ist. Ich muss das so schafffen für mein Selbstbewusstsein ^^ haha.

    P.S. Könntest du es mir näher Erläutern wie du es meinst mit 0 und 1 sen in meiner Schleife?
    Edit: Ach meinste mit Chars ? Wenn zum Beispiel die Zahl da rein passt das ich ne 1 ausgebe. hahaha Jep hast recht werde daas mal verändern ist viel besser hahah, aber könnte jemand mir trotzdem mein Fehler zeigen, da es mich sehr interessiert, da es eigentlich der selbe code ist wie im IF und trotzdem funktioniert er nicht.



  • GorillaHoden schrieb:

    Wenn du zum beispiel als eingabe -100 hast, also den binärcode davon wissen willst, dann wird 4294967296 - 100 genommen.

    Nein.

    Du rechnest 4294967296 - eingabe, also 4294967296 - (-100).



  • OHHHH OMG danke ist mir nicht aufgefallen. Werde mal gleich ausprobieren ob das der Fehler war.

    EDIT: OK Danke gelöst. So ein kleiner aber feiner Fehler ^^.



  • Du solltest dein Lehrmaterial schnellstens auf "Debugger" ausweiten. Der haette hier vermutlich sehr schnell geholfen, wenn du es nicht mehr im Kopf schaffst dem Programmablauf zu folgen.



  • Hier eine alternativ Lösungsvorschlag - unter der Verwendung des Modulo-Operators.

    unsigned int number = getInputFromUser<unsigned int>("Zahl", 0);
    
    std::cout << "Lesrichtung von unten nach oben!" << std::endl;
    do {
      if (number % 2 == 0) {
        std::cout << "0" << std::endl;
      } else {
        std::cout << "1" << std::endl;
      }
    
      number /= 2;
    } while (number != 0);
    

    getInputFromUser(title, defaultValue): Ist eine Hilfsmethode bei meiner Konsolenanwendung. Macht nichts anderes wie den Anwender zur einer Eingabe aufzufordern.

    So als eine weitere Idee ...



  • Normalerweise gibts ja genug Bibliotheksfunktionen fuer sowas. Er wollre es aber gern mit dem machen, was er schon weiss.


Log in to reply