Zahl binär ausgeben



  • Moin, in meinem C++ - Buch gibt es ( um sich mit den Bit-Operatoren vertrauter zu machen ) eine Aufgabe, welche verlangt, dass ich eine Zahl binär auf der Konsole ausgeben soll. Hierzu muss ich leider sagen, dass ich das Binärsystem allgemein zwar etwas verstehe, es aber in C++ für mich ganz anders ist, weil es immer ein Vorzeichenbit gibt.
    Wie auch immer, jedenfalls verstehe ich die Lösung nicht so ganz :

    cout << "Eingabe einer Zahl: ";
    	int zahl = 0;
    	cin >> zahl;
    
    	int AnzahlBits	= { sizeof(zahl) * 8 };
    
    	for (int i = AnzahlBits-1; i>=0; i--)
    	{ 
    		if (zahl & (1 << i))
    			std::cout << "1";
    		else 
    			std::cout << "0";
    	}
    	std::cout << std::endl;
    

    Um es mal präzise zu machen, diese Zeile verstehe ich nicht :

    if (zahl & (1 << i))
    

    Wäre toll wenn sich jemand eben die Zeit nimmt um mir das kurz zu verklickern!



  • Nur Fließkommazahlen haben ein Vorzeichenbit. Ganzzahlen sind praktisch immer im Zweierkomplement und außerdem gibt es unsigned.
    1 << i verschiebt eine 1 um i Bits nach links. Also erst um AnzahlBits-1 Bits, damit hast du das erste Bit von links. Dann um AnzahlBits-2 Bit für das zweite Bit von links usw.
    zahl & (1 << i) ergibt dementsprechend 1 wenn das Bit an der i-ten Stelle gesetzt ist und sonst 0. Und das if wird für 1 ausgeführt und gibt "1" aus und für 0 gibt der else-Zweig "0" aus.
    Ist mir etwas unklar wieso dort nicht direkt std::cout << (zahl & (1 << i)) steht.



  • nwp3 schrieb:

    Ist mir etwas unklar wieso dort nicht direkt std::cout << (zahl & (1 << i)) steht.

    zahl & (1 << 10) ergibt 0 oder 1^10, nicht 0 oder 1... Bin müde.



  • Vielen Dank für die schnelle Antwort,
    bei mir hat es klick gemacht, als du erwähnt hast, dass eine 1 um x Bits nach links verschoben wird. Mein Problem war auch, ich habe die 1 nicht als einzelne Zahl angesehen sondern hab mir immer gedacht in "zahl" wird etwas hinein geschoben. Also wenn ich das Richtig verstanden habe kann man das etwa so auffassen ( zahl ist 5 ) :
    5 ( binär ) : 0000 0000 0000 0000 0000 0000 0000 0101
    1 ( verschoben ) : 1000 0000 0000 0000 0000 0000 0000 0000

    Dann prüft er ob das bei der 5 eine 1 gesetzt ist und gibt dementsprechend eine 0 oder 1 aus. Das ganze geht so lange weiter bis die 1 eben ganz vorne angekommen ist.

    Hab ich das richtig verstanden?



  • Yup.



  • Dankeschön, endlich kann man mal mit gutem Gewissen weiter lernen 🙂



  • nwp3 schrieb:

    zahl & (1 << 10) ergibt 0 oder 1^10, nicht 0 oder 1... Bin müde.

    Ja scheint so 😉

    Was ist 1*1*1*1*1*1*1*1*1*1?

    Richtig ist:
    zahl & (1 << 10) ergibt 0 oder 2^10.


Anmelden zum Antworten