Dezimal in Binär



  • Guten Tag,

    int main() {
        cout << "Eingabe einer Zahl: ";
        int zahl = 5;
        //cin >> zahl;
        int anzahlDerBytes = sizeof zahl; //4
        int anzahlDerBits = 8 * anzahlDerBytes; //32
        cout <<" binaer :  ";
        for(int k = anzahlDerBits-1; k >= 0 ; --k) {
            if(zahl & (1 << k)) {
                cout << "1";
            }
            else {
                cout << "0";
            }
        }
        cout << endl;
    }
    

    ich verstehe die Abfrage der Zeile 9 leider gar nicht. Hab das ganze auch schon debuggt, ich versteh aber nicht wann es true wird.
    Weil der bitand -Operator '&' liefert doch nur im folgenden fall true zurück:
    1&1 = 1
    und die restlichen Fälle 0:
    0&1 = 0
    0&0 = 0
    1&0 = 0

    Bei einer Eingabe von 5 haben wir in Binär raus:
    0000000000000000000000000000101
    heißt das bei der Bedingung zwei mal true rauskam, nur ich versteh nichtt wann.
    Was die 1<<k macht habe ich glaube ich soweit verstanden, im ersten Schleifendurchlauf verschiebtder Shift Operator die 1 um 31 stellen nach links und im zweiten durchlauf 30 stellen usw.
    Nur was wird dann genau geprüft?
    if(5 & (1<<31)), fragt der 5&30 ab? Kann ich mir nicht vorstellen



  • Das ist das sogenannte "maskieren".
    Es wird in der Schleife jedes einzelne Bit der Zahl überprüft, ob dieses gesetzt ist. Die Abfrage zahl & (1 << k) ist nur dann true (d.h. ungleich 0), wenn das k. Bit in zahl gesetzt ist.
    Da in 1 << k jeweils nur genau 1 Bit gesetzt ist, kann durch die &-Operation nur entweder 0 oder aber 1 << k (d.h. ungleich 0) herauskommen - und alle anderen Bits der zahl werden dabei "ausmaskiert", da x & 0 immer 0 ergibt.



  • Füg einfach zwischen Zeile 8 und Zeile 9 noch die Zeile

    cout << (1 << k) << '\n';
    

    ein, dann siehst Du, mit welchen Werten Deine zahl ver-and-et wird ...



  • @Belli: Die Dezimalpräsentation der Zahl sagt aber nicht so viel aus. Man müßte schon die Binärpräsentation ausgeben (LOL)...



  • @KogoroMori21 sagte in Dezimal in Binär:

    1&1 = 1
    und die restlichen Fälle 0:
    0&1 = 0
    0&0 = 0
    1&0 = 0

    Das wird beim &-Operator aber für jede der 32 Stellen getrennt gemacht und an der entsprechenden Stelle im Ergebnis wieder abgelegt.

    Da das (1 << k) nur an einer Stelle eine 1 hat, wird aber nur diese ein Stelle überprüft.
    Wenn da zahl eine 0 hat, ist das Ergebnis auch 0 und somit unwahr.

    _101     _101     _101
    &100     &010     &001
    =100     =000     =001
    wahr     unwahr   wahr
    

  • Mod

    @Th69 sagte in Dezimal in Binär:

    @Belli: Die Dezimalpräsentation der Zahl sagt aber nicht so viel aus. Man müßte schon die Binärpräsentation ausgeben (LOL)...

    Simpel: cout << '1' << string(k, '0') << '\n'; 😀



  • Stimmt! Oder noch besser cout << string(anzahlDerBits-1-k, '0') << '1' << string(k, '0') << '\n'; 🙂



  • Das sind bisher super hilfreiche antworten und ich habe es auch deutlich besser verstanden, es wird nur dann true, wenn ganz links das Bit 1 ist.
    Habe die Binärpräsentation auch im Code drin stehen.

    Nur ich verstehe halt noch nicht ganz genau in wie weit die zahl = 5 dies beeinflusst und warum da überhaupt eine Zahl 1 ganz links erscheint..

    100000000000000000000000000000010
    

    Ich meine die 5 wird ja als 5 in der if-Bedingung gesehen und nicht als 101 oder hab ich da was komplett falsch verstanden?😅


  • Mod

    Leider komplett falsch verstanden.

    Fügen wir doch wirklich mal die hier vorgeschlagenen Ausgaben ein, um zu verstehen, was passiert:

    #include <iostream>
    using namespace std;
    
    int main() {
        cout << "Eingabe einer Zahl: ";
        int zahl = 5;
        //cin >> zahl;
        int anzahlDerBytes = sizeof zahl; //4
        int anzahlDerBits = 8 * anzahlDerBytes; //32
        cout <<" binaer :  ";
        for(int k = anzahlDerBits-1; k >= 0 ; --k) {
        	cout << "k == "  << k << "; 1 << k ==  0b"  << string(anzahlDerBits-1-k, '0')  << '1' <<  string(k, '0') << "; " 
                     << zahl << " & (1 << k) == "  <<  (zahl & (1 << k))  << '\n';
            if(zahl & (1 << k)) {
                cout << "1\n";
            }
            else {
                cout << "0\n";
            }
        }
        cout << endl;
    }
    

    Ausgabe:
    https://ideone.com/beXsCq
    Fällt dir ein Muster auf, wann if(zahl & (1 << k)) in den True-Zweig abbiegt? Erklär' mal!



  • @KogoroMori21 sagte in Dezimal in Binär:

    Was die 1<<k macht habe ich glaube ich soweit verstanden, im ersten Schleifendurchlauf verschiebtder Shift Operator die 1 um 31 stellen nach links und im zweiten durchlauf 30 stellen usw.
    Nur was wird dann genau geprüft?
    if(5 & (1<<31)), fragt der 5&30 ab?

    Hm, dein erster Satz klingt noch so, als hättest du es verstanden aber mir scheint, dir ist der <<-Operator vielleicht doch nicht klar, wenn du hier auf die Idee kommst, dass aus (1<<31) auf einmal 30 wird.

    a << b bedeutet: schiebe a (die Bitdarstellung) um b Stellen nach links, und fülle rechts mit 0 auf.

    1 (als byte) ist 00000001
    1 << 1 ist: 00000010 (=2 in Dezimaldarstellung)
    1 << 2 ist: 00000100 (=4 in Dezimaldarstellung)
    usw.
    Jedes Verschieben nach links entspricht auch dem Multiplizieren mit 2.

    (1<<31) schiebt einunddreißig mal nach links! Das ist also eine sehr große Zahl und weit weg von der 30.



  • @KogoroMori21 sagte in Dezimal in Binär:

    Ich meine die 5 wird ja als 5 in der if-Bedingung gesehen und nicht als 101

    5 Dezimal ist identisch mit 101 Binär.

    Da ist für den Rechner kein Unterschied (denn der hat intern nur die binäre Darstellung)

    oder hab ich da was komplett falsch verstanden?

    Eher Ja.



  • Okay super ich danke euch Allen! Ich habe es jetzt erst verstanden:)


Anmelden zum Antworten