Verständnisproblem der Lösung zum bitweisen ausgeben einer Zahl



  • Guten Morgen 👋🏻

    Wie der Titel bereits aussagt bekomme ich im Speziellen eine Zeile der Lösung zu der Aufgabe nicht interpretiert. Die Aufgabe ist recht simpel aber die Lösung verstehe ich dann leider doch nicht komplett.

    #include <iostream>
    
    int main()
    {
        int zahl;
        
        std::cout << "Bitte Zahl eingeben: ";
        std::cin >> zahl;
    
        int ZahlInBytes = sizeof zahl;
        int ZahlInBits = 8 * ZahlInBytes;
    
        std::cout << "binär: ";
        for (int i = anzahlDerBits - 1; i >= 0; --i)
        {
            if (zahl & (1 << i))
            {
                std::cout << "1";
            }
            else
            {
                std::cout << "0";
            }
        }
        
        return 0;
    }
    

    Bis zur for-Schleife bin ich noch selbst gekommen aber danach war ich leider aufgeschmissen. Der für mich unverständliche Teil ist folgender:

     if (zahl & (1 << i))
    

    Ich verstehe leider nicht wie der bitweise UND Operator in Kombination mit dem "linksschiebe-Operator" hier wirkt. Ich habe mir dazu jetzt schon so einiges angeschaut aber wirklich verständlich war für mich nichts davon....

    Mein Fachbuch welches ich begleitend zum Programmierbuch durcharbeite beinhaltet den Abschnitt logische Operationen inklusive der Wahrheitstafeln für diese, welche besagt das bei der UND Operation ausschließlich 1 UND 1 = 1 ergibt.

    Wie in besagter Codezeiler da allerdings 1 UND 1 zusammenkommt verstehe ich beim besten Willen nicht... Ich hoffe jemand erbarmt sich meiner und kann mich hier erleuchten 😕



  • @OwnliE sagte in Verständnisproblem der Lösung zum bitweisen ausgeben einer Zahl:

    welche besagt das bei der UND Operation ausschließlich 1 UND 1 = 1 ergibt.

    Beim & gilt das für jedes Bit der Zahl einzeln.

    Das 1. Bit der ersten Zahl wird mit dem 1. Bit der zweiten Zahl verUNDet und dann als 1. Bit im Ergebnis abgelegt.
    Das 2. Bit der ersten Zahl wird mit dem 2. Bit der zweiten Zahl verUNDet und dann als 2. Bit im Ergebnis abgelegt.
    Das 3. Bit der ersten Zahl wird mit dem 3. Bit der zweiten Zahl verUNDet und dann als 3. Bit im Ergebnis abgelegt.
    ....
    Das n. Bit der ersten Zahl wird mit dem n. Bit der zweiten Zahl verUNDet und dann als n. Bit im Ergebnis abgelegt.

    Wie in besagter Codezeiler da allerdings 1 UND 1 zusammenkommt verstehe ich beim besten Willen nicht.

    Die 1 wird mit dem << an die entsprechende Position geschoben, damit nur ein Bit in der zweiten Zahl gesetzt ist.

    https://de.wikipedia.org/wiki/Bitweiser_Operator#UND



  • @DirkB achsoooo ja schau an ist ja tatsächlich garkein Hexenwerk im Gange hier vielen Dank jetzt ergibt das deutlich mehr Sinn 😃



  • Nennt mich "blöd", aber ich finde dies wesentlich angenehmer zu lesen:

    #include <iostream>
    
    int main()
    {
        int zahl;
        
        std::cout << "Bitte Zahl eingeben: ";
        std::cin >> zahl;
    
        const int no_of_bytes = sizeof zahl;
        const int no_of_bits = 8 * no_of_bytes;
    
        std::cout << "binaer: ";
        for (int i = 0; i < no_of_bits; i++)
        {
            const int index = no_of_bits - 1 - i;
            if ((1 << index) & zahl)
            {
                std::cout << "1";
            }
            else
            {
                std::cout << "0";
            }
        }
        
        return 0;
    }
    

    Es sind auch "nur" zwei bitweise Operationen...


Log in to reply