Bitwise Operations Verständnisproblem



  • Hallo.

    Ich möchte meiner Klasse beibringen mit so genannten FLAGS umzugehen.
    Mit solch einer Schreibweise:

    void func(FLAG1 | FLAG2);
    

    Also habe ich mich etwas informiert und bin auf Bitwise Operations gestoßen und habe mir auch durchgelesen wie und warum das ganze im detail funktioniert Meine Quelle war http://en.wikipedia.org/wiki/Bitwise_operation. Ich habe eigentlich alles verstanden, beziehungsweise es ist nichts unklar. Nun versuche ich die ganze Theorie in C/C++ Abzubilden. Jedoch scheitert das etwas und ich komme nicht ganz dahinter, wo hier mein Denkfehler liegt.

    Um nicht alles kompliziert zu machen, habe ich ein Test-Schnipsel geschrieben, welches mein Problem veranschaulichen soll.

    // Das sind meine Eigenschaten
    // Geplant ist as god, immortal und invisible enthält.
    enum property
    {
        immortal = 1 << 1,
        invisible = 1 << 2,
        god = 1 << 3
    };
    
    // Meine Funktion, welche die Eigenschafen Prüft und
    // entsprechend reagiert.
    void make_me(int prop)
    {
        if (prop & immortal)
            std::cout << "I'm immortal" << std::endl;
        if (prop & invisible)
            std::cout << "I'm invisible" << std::endl;
    }
    
    // Sollte unmissverständlich sein
    int main()
    {
        std::cout << "(*)make_me(immortal)" << std::endl;
        make_me(immortal);
        std::cout << std::endl;
        std::cout << "(*)make_me(invisible)" << std::endl;
        make_me(invisible);
        std::cout << std::endl;
        std::cout << "(*)make_me(immortal | invisible)" << std::endl;
        make_me(immortal | invisible);
        std::cout << std::endl;
        std::cout << "make_me(god)" << std::endl;
        make_me(god);
    
        return 0;
    }
    

    Num zum Problem. Die Ausgaben von make_me(imortal) , make_me(invisible) und make_me(imortal | invisible) funktionieren genau so wie sie sollen.

    Output:
    (*)make_me(immortal)
    I'm immortal
    
    (*)make_me(invisible)
    I'm invisible
    
    (*)make_me(immortal| invisible)
    I'm immortal
    I'm invisible
    
    (*)make_me(god)
    

    Was ich nicht verstehe ist warum make_me(god) keine ausgabe gibt. So wie ich das verstanden habe müsste die Kombination von allem ( immortal UND invisible ) god entsprechen, oder sehe ich das hier falsch?

    Über Tipps wäre ich dankbar.

    Grüße.



  • ne.
    da steht 1 << 3, nicht 6.
    1 << 3 ist 8.
    1 << 2 ist 4 und 1 << 1 ist 2.

    und 2|4 ist halt eben 6 und nicht 8.
    bzw. umgekehrt: in 8 ist weder das bit 1 nocht das bit 2 gesetzt, sondern nur das bit 3 (mit 0 beginnend gezählt, also 1 = bit 0). also gibt sowohl 8 & (1<<2) als auch 8 & (1<<1) als ergebnis 0.

    wenn du die 1 << wegnimmst hast du 1 (bit 0), 2 (bit 1) und 3 (bit 0 und 1). dann würde es gehen.

    oder du schreibst gleich was du meinst, also god = immortal | invisible. dann würde es auch gehen, auch mit unveränderten immortal und invisible werten.



  • Ach mist, darauf hätte ich auch selber kommen müssen. Danke für die Hilfe.



  • Kein Problem.
    Klar gestellte Frage, gut und ausreichend beschrieben 👍

    Bei sowas hilft man gerne (noch dazu wenn es so einfach ist wie hier 🤡 ).


Anmelden zum Antworten