Bitpacking
-
Bei folgendem Code werden immer mehrere Dinge ausgegeben, obwohl nur ine Flag uebergeben wurde:
#include <iostream> #define UI_CENTER 0x00000001 #define UI_LEFT 0x00000002 #define UI_RIGHT 0x00000003 void Print( int Flag ) { if( Flag & UI_CENTER ) { std::cout << "UI_CENTER\n"; } if( Flag & UI_LEFT ) { std::cout << "UI_LEFT\n"; } if( Flag & UI_RIGHT ) { std::cout << "UI_RIGHT\n"; } } int main() { Print( UI_CENTER ); return( 0 ); }
Was ist daran falsch?
-
hex | bin ------------- 0000 | 0000 0001 | 0001 0002 | 0010 0003 | 0011 // <- 0004 | 0100
änder mal
#define UI_RIGHT 0x00000003 // in #define UI_RIGHT 0x00000004
-
Ja, danke. Jetzt funktionierts. Hab mir schon fast gedacht, dass es so etwas ist.
-
mach doch
#define A (1)
#define B (1<<1)
#define C (1<<2)
#define D (1<<3)
etc
-
Webbi: Warum verwendest Du eigentlich dafür Flags? Muss irgendwann ein Flag auf (UI_LEFT | UI_CENTER) oder ähnliches gesetzt werden? Die Möglichkeit das zu tun ist nämlich IMO einer der wenigen großen Vorteile von Bit-Flags.
-
Nein, aber da kommen noch andere Flags hinzu, die man dann zusammen mit den bestehenden kombinieren kann.