Flags extrahieren
-
Hallo.
Wen ich ein DWORD Flags deklariert habe und dann schreibeFlags = FLAG_FIRST|FLAG_SECOND;Wie kann ich dann rausfinden was für Flags in der Variable Flags sind?
-
if ( Flags & FLAG_FIRST ) std::cout << "FLAG_FIRST is set";
-
Oder du verwendest die Kapazitäten der STL. Hierzu ein Beispiel zur Nutzung der Klasse bitset.
#include <iostream> #include <bitset> using namespace std; int main() { enum options { a, b, c, m, n, x, y }; bitset<7> v; // Bits a und n auf 1 setzen v.set(a); v.set(n); // Bits kippen v.flip(); for (int i=0; i<7; ++i) cout << "flag" << i << ": " << v[i] << endl; // Bit m und n testen cout << "Bit m gesetzt? " << v.test(m) << endl; cout << "Bit n gesetzt? " << v.test(n) << endl; }
-
//flags auslesen //flag im dword enthalten? if(dwProperties & myFlag){ //ja, myFlag enthalten } //flag nicht enthalten? if((dwProperties^myFlag) & myFlag) {//nein, flag nicht enthalten } //flags setzen //flag sicher entfernen dwProperties=dwProperties & (0xFFFFFFFF^myFlag); //flag entfernt //flag setzen dwProperties=dwProperties | myFlag; //flag gesetzthab ich was vergessen?
-
@lucky tux: und wozu das alles, wenn alle mögliche funktionen mit den dwFlags wunderbar funktionieren? ausserdem... istes nicht langsamer, wenn man mit den einzelnen bits, anstatt mit 4bytes-großen werten arbeitet?
ist wirklich nur ne frage, habs selber noch nie ausprobiert...
-
Wenn die 32 Bit reichen:
inline void set( int &bitset, int bit ) { bitset |= 1 << bit; } inline void unset( int &bitset, int bit ) { bitset &= ~( 1 << bit ); } inline bool is_set( const int &bitset, int bit ) { return bitset & ( 1 << bit ); }grüße
-
@ Andrey:
Warum verwendet man in C++ häufiger die STL-Container anstatt den C-Arrays, wenn nicht alles an Performance gefordert ist?
Die Template-Klasse bitset bietet wie die anderen Klassen der STL eine komfortable Schnittstelle und lässt sich dementsprechend leicht in die Applikation integrieren.
Aber ich möchte hier keinen Glaubenskrieg eröfnen, denn es ist sehr fragwürdig welcher der beiden Ansätze der "richtige" ist... Dennoch wollte ich hier die Möglichkeit mit bitset erwähnt haben.
-
Andrey schrieb:
//flag nicht enthalten? if((dwProperties^myFlag) & myFlag) {//nein, flag nicht enthalten }hab ich was vergessen?
das sollte ja auch noch lesbarer gehen

if(!(dwProperties & myFlag)){ }