2008-09-24 8 views

Antwort

42

Hier ist eine Funktion ein Endergebnis von 1 oder 0 haben, die verwendet werden können jede gewünschte Bit zu testen:

bool is_bit_set(unsigned value, unsigned bitindex) 
{ 
    return (value & (1 << bitindex)) != 0; 
} 

Ein bisschen Erklärung:

Die Linksverschiebung Operator (< <) wird verwendet, um eine Bitmaske zu erstellen. (1 < 0) ist gleich 00000001, (1 < < 1) wird gleich 00000010 sein, (1 < < 3) wird gleich 00001000 sein, usw. Eine Verschiebung von 0 testet das rechte Bit. Eine Verschiebung von 31 wäre das am weitesten links liegende Bit eines 32-Bit-Wertes.

Der Bitwise-Operator (&) liefert ein Ergebnis, bei dem alle Bits auf beiden Seiten gesetzt sind. Beispiele: 1111 & 0001 = 0001; 1111 & 0010 == 0010; 0000 & 0001 = 0000. wird der Ausdruck (Wert & (1 < < BitIndex)), so, kehrt die Bitmaske, wenn das zugeordnete Bit 1 in Wert ist, oder 0 zurück, wenn das zugehörige Bit 0.

Schließlich ist, Wir prüfen nur, ob das Ergebnis nicht Null ist. (Dies könnte tatsächlich weggelassen werden, aber Ich mag es explizit machen.)

+0

Wie wäre es mit einem Assert, wenn der Bitindex> 31 ist? – luke

+0

Ich denke, die aktuelle Funktionalität, die in diesem Fall falsch zurückgegeben würde, ist richtig ... –

+0

Ist das Endian sicher? – luke

4

Sie können einen AND-Operator verwenden. Beispiel Sie haben: 10101010 und Sie wollen das dritte Bit überprüfen, die Sie tun können: (10101010 und 00100000), und wenn Sie 00100000 erhalten Sie wissen, dass Sie die Flagge an der dritten Position zu 1.

+0

C hat keinen "UND" -Operator. Außerdem müssen Sie ein bitweises UND, nicht ein logisches verwenden. –

1
byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set 

int isThirdBitSet(byte in) { 
return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise 
} 
1

Sie haben können mach wie Daok sagt und du machst ein bisschen bis zum ODER zu dem Ergebnis der vorherigen UND-Operation. In diesem Fall werden Sie

6

Als Erweiterung @Daoks beantworten

Wenn Bit-Manipulation tut es wirklich ein sehr solides Wissen über bitwise operators haben hilft .

Auch die bitweise Operator "AND" in C ist &, also was Sie wollen, ist zu tun:

unsigned char a = 0xAA; // 10101010 in hex 
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check 

if(a & b) { 
    //bit set 
} 

else { 
    //not set 
} 

Above ich das bitweise verwendet "AND" (& in C), ob eine bestimmte zu prüfen Bit wurde gesetzt oder nicht. Ich habe auch zwei verschiedene Arten benutzt, um Binärzahlen zu formulieren. Ich empfehle Ihnen, den obigen Wikipedia-Link zu lesen.

+0

Warum muss ich ein Bitshift machen? – Pokus

+0

Es gibt keinen Grund, dass Sie das Bitshift in einer bestimmten Variable speichern müssen, ich benutzte es als Beispiel für einen bitweisen Operator. Jedoch, wenn Sie Bitshift nicht müssen Sie einen expliziten Wert irgendwo verwenden. Das Bitshift, das ich verwendet habe, war eine einfache Möglichkeit 00000100 zu benutzen, wobei bitpos in diesem Beispiel 2 ist. – mdec

0

Verwenden Sie eine bitweise (nicht logisch!) Und vergleichen Sie den Wert mit einer Bitmaske.

if (var & 0x08) { 
    /* the fourth bit is set */ 
} 
1

Traditionell zu überprüfen, ob das niedrigste Bit gesetzt ist, wird dies in etwa so aussehen:

int MY_FLAG = 0x0001; 
if ((value & MY_FLAG) == MY_FLAG) 
    doSomething(); 
+0

Das testet, dass ein spezifisches Bit * und nur dieses Bit * gesetzt ist. –

+2

Nein, es ist nicht ... –

+0

Nicht hart codieren! –

2

Niemand falsch gewesen ist, so weit, aber ein Verfahren gibt einen beliebigen Bit zu überprüfen:

int checkBit(byte in, int bit) 
{ 
    return in & (1 << bit); 
} 

Wenn die Funktion ungleich Null zurückgibt, wird das Bit gesetzt.

4

Wenn Sie C++ verwenden und die Standard-Bibliothek erlaubt ist, würde ich vorschlagen, Ihre Flaggen in einer bitset Speicherung:

#include <bitset> 
//... 
std::bitset<8> flags(someVariable); 

wie dann können Sie überprüfen und einstellen Flaggen mit den Tasten [] Indizierungsoperator.

4

Kristopher Johnsons Antwort ist sehr gut, wenn Sie gerne mit einzelnen Feldern wie diesem arbeiten. Ich ziehe den Code leichter zu machen, indem Sie Bit-Felder in C lesen

Zum Beispiel:

struct fieldsample 
{ 
    unsigned short field1 : 1; 
    unsigned short field2 : 1; 
    unsigned short field3 : 1; 
    unsigned short field4 : 1; 
} 

Hier können Sie mit vier Feldern eine einfache Struktur haben, die jeweils 1 Bit groß. Dann können Sie Ihren Code mit einem einfachen Strukturzugriff schreiben.

void codesample() 
{ 
    //Declare the struct on the stack. 
    fieldsample fields; 
    //Initialize values. 
    fields.f1 = 1; 
    fields.f2 = 0; 
    fields.f3 = 0; 
    fields.f4 = 1; 
    ... 
    //Check the value of a field. 
    if(fields.f1 == 1) {} 
    ... 
} 

Sie erhalten den gleichen geringen Größe Vorteil, und lesbaren Code, weil Sie Ihren Feldern sinnvolle Namen in der Struktur geben können.

+0

Beachten Sie, dass ein Problem bei der Verwendung von Bitfeldern darin besteht, dass die Art und Weise, wie sie im Speicher abgelegt werden, implementierungsabhängig ist. Daher kann es schwierig sein, sie mit Daten zu verwenden, die Sie mit anderen Programmen austauschen. –

Verwandte Themen