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)undmake_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 (immortalUNDinvisible)godentsprechen, 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
).