Wie funktionieren Flags in C?

8

Kürzlich bin ich auf einige Beispiele von "Flags" in C und C ++ gestoßen, und ich verstehe nicht ganz, wie sie funktionieren. Nachdem ich einen Quellcode angeschaut habe, ist mir aufgefallen, dass oft Flag-Werte in hexadezimaler Form wie folgt definiert sind:

%Vor%

Mein intuitiver Wert legt nahe, dass diese Werte kombiniert werden. Funktionieren Flags, indem alle Flag-Werte zu einem Int kombiniert werden? Wenn ich beide verwendet hätte wie FLAG1 | FLAG2 wäre das Ergebnis 0x00000011 ?

Muss ich Enums mit Bit-Offsets erstellen oder kann ich aufsteigende Ganzzahlen verwenden wie:

%Vor%     
Justin Meiners 04.09.2010, 19:25
quelle

4 Antworten

22

Sie müssen die Bits versetzen, sonst gibt es keine Möglichkeit, die einzelnen Flags zu extrahieren. Wenn Sie Flags hatten, die 1, 2, 3 und & amp; 4, und einen kombinierten Wert von 5, wie können Sie sagen, ob es 2 & amp; 3 oder 1 & amp; 4?

Sie können es auch so machen, zum Beispiel:

%Vor%

Dann kombinieren Sie Flaggen wie folgt:

%Vor%

Und Sie extrahieren sie so:

%Vor%     
jtbandes 04.09.2010, 19:29
quelle
6

Ihre erste Methode verwendet die Bits nicht auf die effizienteste Weise. Im ersten Beispiel verwenden Sie die hexadezimale Schreibweise und dies entspricht:

%Vor%

Bei der zweiten Methode scheint es, dass Sie jedes Mal um eins erhöht werden. Dies funktioniert nicht, wenn Sie Flags kombinieren, da der kombinierte Wert dasselbe wie ein anderes Flag sein kann (z. B. 1 | 2 == 3).

Sie sollten stattdessen diese Werte verwenden:

%Vor%

Dies sind die Zweierpotenzen und sie können bitweise kombiniert werden - oder in irgendeiner Weise, ohne Kollisionen zu verursachen.

    
Mark Byers 04.09.2010 19:28
quelle
4

Flags wie dieses sind binäre Werte, also können Sie 1, 2, 4, 8, 16, 32, 64, 128 in einem einzigen Byte oder weitere Potenzen von 2 bis zu 2 ^ 31 in einem int kombinieren. Da es sich um binäre Werte handelt, können Sie sie zusammen "or", also, wenn Sie "oder" zusammen 1,2,4, enden Sie zum Beispiel mit 7. Und Sie können das gewünschte Bit mit "und" extrahieren - wenn Sie also einen int mit einigen Flags oder zusammen haben und sehen möchten, ob das "4" Bit gesetzt ist, können Sie if (flag & 4) sagen und es wird Wahr sein, wenn das Bit "4" gesetzt ist.

    
Paul Tomblin 04.09.2010 19:32
quelle
2

Stellen Sie sich die Flags als ein Array von 32 Bits (boolesch) vor

Um eines dieser Bits auf Sie ODER mit 1 & lt; & lt; BitIndex (wobei BitIndex nullbasiert ist, also 0 - 31) Um sie auszuschalten, UND mit ~ (1 & lt; & lt; BitIndex) Um zu überprüfen, ob es ein- oder ausgeschaltet ist, UND es mit (1 & lt; & lt; BitIndex)

Sobald Sie den Unterschied zwischen digitalem OR / AND gegen logisches OR / AND überwinden, wird alles klicken. Dann werden Sie die hexadezimale Schreibweise schätzen!

    
James 04.09.2010 19:47
quelle

Tags und Links