Frage

Ich benutze ein Byte eine Flagge wie 10101010and speichern Ich würde gerne wissen, wie zu überprüfen, ob ein bestimmtes Bit auf 1 oder 0 ist.

War es hilfreich?

Lösung

Hier ist eine Funktion, die verwendet wird, kann eine beliebige Bit zu testen:

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

Ein bisschen Erklärung:

Die linke Shift-Operator (<<) wird verwendet, um eine Bit-Maske zu erstellen. (1 << 0) wird auf 00000001 gleich sein, (1 << 1) gleich sein zu 00000010, (1 << 3) wird gleich 00001000, etc. So eine Verschiebung von 0 prüft das Bit ganz rechts. Eine Verschiebung von 31 würde das linke Bit eines 32-Bit-Wert sein.

Der bitweise und Operator (&) gibt ein Ergebnis, bei dem alle Bits, die 1 auf beiden Seiten eingestellt. Beispiele: 1111 0001 = 0001; 1111 0010 == 0010; So 0000 & 0001 = 0000. Der Ausdruck (Wert & (1 << BitIndex)) kehrt die Bitmaske, wenn das zugehörige Bit 1 in Wert ist, oder 0 zurück, wenn das zugehörige Bit 0 ist.

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

Andere Tipps

Als eine Erweiterung von @Daoks beantworten

Wenn Bit-Manipulation zu tun es wirklich hilft, eine sehr solide Kenntnisse zu haben, Bitoperatoren .

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

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
}

Vor mir das bitweise verwendet „und“ (& C) zu überprüfen, ob ein bestimmtes Bit gesetzt wurde oder nicht. Ich habe auch zwei verschiedene Arten von Binärzahlen zu formulieren. Ich empfehle Ihnen, die Wikipedia überprüfen Link oben.

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

Wenn Sie C ++ verwenden und die Standard-Bibliothek erlaubt ist, würde ich vorschlagen, Ihre Fahnen in einem bitset Speicher:

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

als dann können Sie überprüfen, und Flags gesetzt, die [] Indizierung Operator.

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

Zum Beispiel:

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

Hier haben Sie eine einfache Struktur mit vier Feldern, die jeweils 1 Bit groß. Dann können Sie Ihren Code mit einfacher Struktur Schreibzugriff.

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.

Niemand ist schon falsch 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 gibt nicht Null ist, das Bit gesetzt ist.

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
}

Sie tun können, wie Daok sagt und Sie ein bisschen zu wenig machen oder zu der resultierenden der vorherigen UND-Verknüpfung. In diesem Fall werden Sie ein Endergebnis von 1 oder 0 haben.

Traditionell zu überprüfen, ob die niedrigste Bit gesetzt, das etwas aussehen wird:

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

Verwenden Sie eine bitweise (nicht logisch!) Und den Wert gegen eine Bitmaske zu vergleichen.

if (var & 0x08) {
  /* the fourth bit is set */
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top