Wie realisiert man or-flags im Quellcode?
-
z.B. so:
class Foo { unsigned int m_flags; public: Foo() { m_flags = 0; }; void Set(unsigned int flag); bool IsGrey(); //wurde GREY Flag gesetzt? enum Flags { MAXSIZE = 1, COMPRESS = 2, GREY = 4, MINSIZE = 8 } } //Flags setzen void Foo::Set(unsigned int flag) { m_flags = flag; } //Abfragen ob ein bestimmtes Flag gesetzt wurde bool Foo::IsGrey() { bool OK = false; if( (m_flags & GREY) > 0) OK = true; return OK; } int main() { Foo foo; foo.Set( Foo::GREY | Foo::COMPRESS ); if(foo.IsGrey()) { //... } return 0; }Der Trick ist eigentlich ganz einfach. Für jeden Flag legst du eine Zahl fest die Binär eindeuig ist, z.B.:
00000000 = 0 00000001 = 1 //MAXSIZE 00000010 = 2 //COMPRESS 00000100 = 4 //GREY 00001000 = 8 //usw...Wenn du jetzt z.B. MAXSIZE und COMPRESS oder'st dann steht in m_flags folgendes:
MAXSIZE COMPRESS Ergebnis 00000001 | 00000010 = 00000011Um herauszufinden ob COMPRESS als Flag gesetzt wurde musst du m_flags wieder mit COMPRESS UND Verknüpfen (siehe IsGrey)
flags COMPRESS Ergebnis > 0 00000011 & 00000010 = 00000010Falls COMPRESS nicht gesetzt wurde, dann kommt als Ergebnis auf jedenfall 0 raus
flags COMPRESS Ergebnis = 0 00010101 & 00000010 = 00000000Edit: ich hoffe ich hab deine Frage jetzt nicht falsch verstanden (und alles umsonst geschrieben
)
-
Siehe dazu auch: Bitmanipulation
-
Nein, dass war nicht umsonst geschrieben, sondern eine super Antwort, danke sehr

-
bool Foo::IsGrey() { bool OK = false; if( (m_flags & GREY) > 0) OK = true; return OK; }lachhaft...
-
-.- schrieb:
bool Foo::IsGrey() { bool OK = false; if( (m_flags & GREY) > 0) OK = true; return OK; }lachhaft...
Naja so isses kürzer

bool Foo::IsGrey() { return ((m_flags & GREY) > 0); }
-
bool Foo::IsGrey() { return m_flags & GREY; }

-
Jop, klar geht auch ...aber es soll ja auch noch verständlich sein...aber stimmt schon...noch ne Nr. kleiner

Moin Swordfish !

-
-.- schrieb:
bool Foo::IsGrey() { bool OK = false; if( (m_flags & GREY) > 0) OK = true; return OK; }lachhaft...
Jo, hat schon was...

Greetz, Swordfish
-
Erzählt mal, was hab ich falsch gemacht?
-
du hast es einfach nur zu lang/umständlich gemacht.
-
bool Foo::IsGrey() { return ( m_flags & GREY ) != 0; }hätt's auch getan...

Greetz, Swordfish
-
Fände den Chris++'schen Beitrag FAQ-würdig
hab in lang gesucht
-
nuubi schrieb:
Fände den Chris++'schen Beitrag FAQ-würdig
oder fragwürdig

-
immer nur ein return pro funktion 
-
HEY! schrieb:
immer nur ein return pro funktion 
so ein quatsch!
-
HEY! schrieb:
immer nur ein return pro funktion 
Da is doch nur eins

-
die trolle nehmen überhand!
-
net schrieb:
so ein quatsch!
ist es nicht:
http://www.jaggersoft.com/pubs/SingleExit.htmhttp://www.google.de/search?hl=de&q=multiple+return+statements&btnG=Google-Suche&meta=
http://www.google.de/search?hl=de&q=single+exit+c%2B%2B&btnG=Google-Suche&meta=
-
HEY! schrieb:
net schrieb:
so ein quatsch!
ist es nicht:
na gut. es mag sonderfälle geben wo das nicht so ganz passt. aber die sind eher selten...
-
"single return" ist kein Quatsch, sondern ein Troll. Meine eigene Meinung dazu spare ich mir mal.