Bitweise Operatoren 0x0000 Abfrage
-
Hallo,
ich habe da mal eine Frage bezüglich der bitweisen Operatoren und der Abfrage einer Flagge die mit 0x0000 deklariert wurde.wie kann man eine solche Fahne abfragen, wenn noch andere Flaggen mit der Bitweisen OR verknüpft wurden.
#define WS_OVERLAPPED 0x00000000L #define WS_CAPTION 0x00C00000L #define WS_SYSMENU 0x00080000L DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU; (dwStyle & WS_SYSMENU) ? TRUE : FALSE; //Ist TRUE (dwStyle & WS_CAPTION ) ? TRUE : FALSE; //Ist TRUE (dwStyle & WS_OVERLAPPED) ? TRUE : FALSE; //Ist FALSE
kann mir da jemand helfen?
danke schonmal im voraus!
-
wie kann man eine solche Fahne abfragen
WS_OVERLAPPED (zumindest in modernen Windowsversionen) und andere Flags mit dem Wert 0 kannst du als immer gesetzt ansehen.
__inline BOOL is_ws_set(DWORD style, DWORD ws) { return ws == 0L ? TRUE : style & ws; }
-
Einfach die korrekte Abfrage verwenden. Die funktioniert dann auch für keine oder mehrere gesetzte Bits in
flags
.BOOL is_set(DWORD set, DWORD flags) { return (set & flags) == flags; } DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU; assert(is_set(dwStyle, WS_SYSMENU)); assert(is_set(dwStyle, WS_CAPTION)); assert(is_set(dwStyle, WS_OVERLAPPED));
-
TyRoXx schrieb:
Einfach die korrekte Abfrage verwenden. Die funktioniert dann auch für keine oder mehrere gesetzte Bits in
flags
.BOOL is_set(DWORD set, DWORD flags) { return (set & flags) == flags; }
x & 0 == 0
-
vielen dank für euer antworten,
Ein Gast schrieb:
...andere Flags mit dem Wert 0 kannst du als immer gesetzt ansehen.
aber warum macht man dann Flaggs mit 0 werten, wenn man diese eh immer als gesetzt ansieht?
[EDIT]
__inline BOOL is_ws_set(DWORD style, DWORD ws) { return ws == 0L ? TRUE : style & ws; }
was mir dabei gerade an dem code so auffällt. wird hier nur TRUE zurückgegeben,
wenn style mit nichts (0x0L) belegt ist und man WS_OVERLAPPED abfrägt.
wenn style mit (0x00C00000L) belegt ist und ich WS_OVERLAPPED abfrage kommt auch wieder FALSE zurück.