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?
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:
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.
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!
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:
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.
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.