2010-11-16 10 views
7

Ich versuche, mehr darüber in meinem Projekt zu implementieren.Einfache boolesche Operatoren für Bit-Flags

ich zur Zeit bekommen haben dies im Grunde:

unsigned char flags = 0; //8 bits 

flags |= 0x2; //apply random flag 

if(flags & 0x2) { 
    printf("Opt 2 set"); 
} 

Jetzt habe ich ein wenig komplexer Dinge zu tun, ich will, was ich will drei Flaggen wie dies zu tun, gelten soll:

flags = (0x1 | 0x2 | 0x4); 

Und dann entfernen Flags 0x1 und 0x2 von ihm? Ich dachte, ich so etwas wie dies die Anwendung bitweise tun konnte nicht (und bitweise UND es anzuwenden):

flags &= ~(0x1 | 0x2); 

Offenbar bleiben sie dort oder etwas so oder so, wenn ich überprüfen.

Ich weiß auch nicht, wie man überprüft, ob sie nicht existieren in den Bit-Flags (so kann ich nicht überprüfen, ob mein vorheriger Code funktioniert), wäre es so etwas?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

ich alle Ressourcen nicht aus meiner aktuellen Suchanfragen finden, die diese anwenden, ich bin diese bereit zu lernen, andere zu lehren, ich bin wirklich interessiert. Ich entschuldige mich, wenn das verwirrend oder einfach ist.

Antwort

21

Und die zwei davon entfernen? Ich dachte, ich so etwas tun könnte:

flags &= ~(0x1 | 0x2); 

diese beiden Fahnen zu entfernen, aber offenbar bleiben sie dort oder etwas so oder so.

Das ist der richtige Weg, um Flags zu entfernen. Wenn Sie nach dieser Zeile printf("%d\n", flags) sind, sollte die Ausgabe 4 sein.

Ich weiß auch nicht, wie zu überprüfen, ob sie in den Bit-Flag nicht existieren (so kann ich nicht, wenn mein vorherigen Code Werke überprüfen), es so etwas wie dieser sein würde?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

Nope:

if ((flags & 0x2) == 0) 
    printf("flag 2 not set"); 

EDIT:

für das Vorhandensein von mehreren Flags zu testen:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2)) 
    printf("flags 1 and 2 are set\n"); 

für das Fehlen von mehreren Flags Um zu testen, , vergleiche einfach mit 0 wie zuvor:

if ((flags & (0x1 | 0x2)) == 0) 
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n"); 
+0

Ich war das erste Mal richtig, Danke! – John

+0

Sicher, kein Problem. Bitweise Operatoren machen Spaß. :) – cdhowie

+0

Nun, wie würde ich prüfen, ob zwei Flags ohne boolean gesetzt wurden und? wie 'if (Flags & (0x1 | 0x2))' aber das scheint zu funktionieren, auch wenn ich nur '0x1' setze. – John

11

Ich bin nicht sicher, warum Sie denken, dass Clearing-Vorgang nicht funktioniert.

flags &= ~(0x1 | 0x2); 

ist der richtige Weg, es zu tun.Der Betrieb zu überprüfen, ob ein Bit nicht Satz ist:

if (!(flags & 0x2)) ... 

Die Sie haben:

if (flags & ~0x2) ... 

wird wahr sein, wenn andere Bit gesetzt ist, was wahrscheinlich ist, warum Sie etwas Der Löschvorgang funktioniert nicht. Das Problem liegt nicht in der Klärung, sondern in der Überprüfung.

Wenn Sie möchten, um zu überprüfen, dass alle Bits in einer Gruppe festgelegt sind:

if ((flags & (0x2|0x1)) == 0x2|0x1) ...