Wie kann ich auf eine bestimmte Gruppe von Bits aus einer Variablen zugreifen?

8

Ich habe eine Variable mit "x" Anzahl der Bits. Wie kann ich eine bestimmte Gruppe von Bits extrahieren und dann an ihnen in C arbeiten?

    
user537670 11.12.2010, 03:47
quelle

4 Antworten

19

Sie würden dies mit einer Reihe von 2 bitweisen logischen Operationen tun.

[[Terminologie MSB (msb) ist das höchstwertige Bit; LSB (lsb) ist das niedrigstwertige Bit. Es wird angenommen, dass Bits von lsb == 0 bis zu einigen msb (z. B. 31 auf einer 32-Bit-Maschine) nummeriert sind. Der Wert der Bitposition i stellt den Koeffizienten der 2 ^ i-Komponente der Ganzzahl dar.]]

Wenn Sie beispielsweise int x haben und einen Bereich von Bits x [msb .. lsb] inklusive extrahieren möchten, z. B. ein 4-Bit-Feld x [7..4] aus dem x [31 ..0] Bits, dann:

  1. Durch Verschieben von x um lsb-Bits, z.B. x >> lsb , Sie setzen das lsb-Bit von x in das 0. (niedrigstwertige) Bit des Ausdrucks, wo es sein muss.

  2. Nun müssen Sie alle verbleibenden Bits, die über denen von msb liegen, ausblenden. Die Anzahl solcher Bits ist msb-lsb + 1. Wir können eine Bitmaskenfolge von '1' Bits bilden, die mit dem Ausdruck ~(~0 << (msb-lsb+1)) lang sind. Zum Beispiel ~ (~ 0 & lt; (& lt; (7-4 + 1)) == ~ 0b11111111111111111111111111110000 == 0b1111.

Wenn Sie alles zusammenfügen, können Sie den gewünschten Bitvektor mit diesem Ausdruck in eine neue Ganzzahl extrahieren:

%Vor%

Zum Beispiel

%Vor%

Macht Sinn?

Happy Hacking!

    
Jan Gray 11.12.2010 04:20
quelle
5

Wenn Sie mit einem Primitiv arbeiten, verwenden Sie einfach bitweise Operationen:

%Vor%

Wenn x größer als eine triviale Primitive sein kann, aber zur Kompilierungszeit bekannt ist, können Sie std::bitset<> für die Aufgabe verwenden:

%Vor%

Wenn x zur Kompilierzeit nicht bekannt ist, können Sie std::vector<unsigned char> verwenden und dann die Bit-Manipulation zur Laufzeit verwenden. Es ist mehr Arbeit, die Absicht liest weniger offensichtlich als mit std::bitset und es ist langsamer, aber das ist wohl die beste Option für x zur Laufzeit.

%Vor%     
wilhelmtell 11.12.2010 04:04
quelle
2

arbeiten an Bits mit & amp ;, |. & lt; & lt ;, & gt; & gt; Betreiber. Wenn Sie beispielsweise einen Wert von 7 (Ganzzahl) haben und das 2. Bit auf Null setzen möchten:

7 ist 111

(Zero-ing 2. Bit UND es mit 101 (5 in Dezimal))

111 & amp; 101 = 101 (5)

Hier ist der Code:

%Vor%

Sie können mit anderen Operatoren wie OR arbeiten, nach links verschieben, nach rechts verschieben usw.

    
Neilvert Noval 11.12.2010 06:34
quelle
0

Sie können Bitfelder in einer Union verwenden:

%Vor%     
user411313 11.12.2010 08:28
quelle

Tags und Links