2013-10-27 4 views
13

Ich versuche Masken zu verwenden und bestimmte Bits in einem Byte zu manipulieren. Zum Beispiel:Wie wird ein bestimmtes Bit in einem Byte in C umgedreht?

Ich möchte ein Programm in C schreiben, das zwei Bits an bestimmten Positionen, z. das Bit an Position 0 und das an der dritten Position. So, 11100011, würde 01110011 werden.

Wie kann ich diese Bits austauschen?

+1

Sie erhalten spezifische Antwort zu diesem aber Google Boolean Algebra und Wahrheit Tabellen. –

Antwort

15

Flipping ist etwas geschehen durch XOR-ing mit einer Maske: gesetzten Bits an den Positionen, die Sie drehen möchten, und dann eine XOR auszuführen, wie folgt aus:

int mask = 0x90; // 10010000 
int num = 0xE3; // 11100011 
num ^= mask;  // 01110011 

Hier ein paar Hinweise sind:

  1. Bits werden üblicherweise aus der niederwertigsten Position gezählt, so Ihr Beispiel Flips Bits in den Positionen 4 und 7 ist nicht an den Positionen 0 und 4
  2. eine Bitmaske für eine einzelne Position zu konstruieren, verwendet Ausdruck 1 << n, wo n ist die Positionsnummer, die vom niedrigstwertigen Bit zählt.
  3. Um mehrere Bits in einer Maske zu kombinieren, verwenden Sie den Operator |. Zum Beispiel, (1 << 4) | (1 << 7) konstruiert die Maske für das Flipping Bits 4 und 7.
0

Zunächst einmal, viel Glück!

Eine Bemerkung - es ist nützlicher, die Bits von rechts und nicht links zu zählen, da es verschiedene Byte-/Wortgrößen gibt (8-Bit, 16-Bit, etc.) und diese Zahl die Kompatibilität besser erhält. In Ihrem Fall beziehen Sie sich also auf die Bits 7 und 4 (Nullzählung).

Meinten Sie "flip" (ändern 0 < -> 1 Bits) oder "schalte" sie zwischen einem und dem anderen?

Für die erste Option ist die obige Antwort (XOR mit "int mask = 0x90; // 10010000") sehr gut. Für die zweite ist es ein bisschen schwieriger (aber nicht viel).

+0

Danke dir! Ich meinte wechseln! –

+0

Froh, zu helfen! Übrigens, "Voting" für gute Antworten ist eine gute Möglichkeit, Ihre Wertschätzung zu zeigen ;-) – AssafR

1

Um Bits umzukehren, können Sie den exklusiven ODER-bitweisen Operator verwenden. Dies erfordert zwei Operanden (typischerweise den Wert, den Sie bearbeiten möchten, und die Maske, die definiert, welche Bits gekippt werden). Der Operator eXclusive OR (XOR) wird nur dann ein Bit spiegeln, wenn einer der beiden auf 1 gesetzt ist, aber NICHT beide. Siehe die (einfache) Beispiel unten:

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int num = 7; //00000111 
    int mask = 3; //00000011 

    int result = num^mask; //00000100 
    printf("result = %d\n", result); //should be 4 

    return 0; 
} 
2

Wenn Ihr Byte x ist, und Sie möchten die Bits an der i-ten und j-ten Position wechseln:

x = x^((1<<i) | (1<<j)); 

Also, in Ihrem Fall wäre es nur (1 < < 4) | (1 < < 7). :)

Verwandte Themen