Zugriff auf bits in einem char in C
Ich habe eine hex-Zahl 0x37 und seine binäre Darstellung 0011 0111. Wie greife ich auf die ersten 2 bits der binären Darstellung, die "11"? Wie benutze ich bit-shifting oder Maskierung um dies zu erreichen? Ich kann auf etwas, aber nicht zwei bits in einem Rutsch?
InformationsquelleAutor edelweiss | 2011-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
&
Ihre Nummer mit 0x03, erhalten Sie die letzten zwei bits.InformationsquelleAutor dasblinkenlight
Hier ist ein Beispiel, um den Zugriff, es Stück für Stück:
InformationsquelleAutor shinkou
Könnte man auch verwenden, bit-Felder, dies zu tun. Der schlechte Teil über das bit-Felder, die genau wie Sie funktionieren, ist etwas compiler-abhängig, aber wenn Sie nicht brauchen, um das portieren von code auf vielen Architekturen ist es vielleicht in Ordnung.
Hier ist ein Beispiel, geschrieben auf einer Ubuntu-Linux-Rechner und getestet mit GCC.
Die union ist da, also können wir es als full-byte, oder es von bit-Feldern.
#pragma pack(1)
ist, sicherzustellen, dass die bit-Felder-pack nach unten in ein byte, kein extra "padding" - bits. (Wie ich schon sagte, Sie befinden sich auf Implementierungsdetails wenn Sie bit-Feldern).Aber schauen Sie, wie einfach und sauber es ist, um die bits, die Sie möchten. Schreiben Sie in ganzen byte-und Auslesen der bits, die Sie wollen, oder schreiben Sie in den bits, die Sie möchten, und Lesen Sie die ganze byte.
Wenn Sie gehen, verwenden Sie code wie diesen, ist es immer eine gute Idee, haben einige behauptet, dass stellen Sie sicher, es ist Arbeit.
Wenn Sie nicht benutzt bit-Felder, schlage ich vor, Sie definieren eine Funktion, die Ihre Verschiebung und Maskierung für Sie, um sicherzustellen, dass Sie nicht mess up. Vielleicht so etwas wie dieses:
Übergeben Sie einen Wert, dann wird die bit-position, die Sie wollen, bits aus, und wie viele bits Sie wollen. So greifen 6 bits beginnend von der bit-position 2, mit einem test-Wert von 0x71, könnte man sagen:
Wenn Sie nicht wie die lookup-Tabelle, und Sie wollen den kleinsten code, um dies zu tun, können Sie verwenden:
Müssen Sie sicherstellen, dass die mask-bits erklärt
unsigned
denn wenn Sie signiert sind, die rechts-shift-operation Unterschreiben zu erweitern.Wenn Sie erklären, dass diese Letzte version der Funktion, die als inline -, legen Sie es in header-Dateien, und rufen Sie es mit Konstanten Werten für
i_bit
undc_bits
es kompilieren wird bis zu einem minimalen code, um das problem zu lösen. (Zum Beispiel, wenni_bit
ist 0, der compiler weiß, dass>> 0
tut nichts und wird einfach nicht generieren, code. Und wenn der compiler weißc_bits
als eine Konstante ist, kann es tun all die Arbeit, die Verlagerungmask_bits
zur compile-Zeit.) Aber Sie müssen sicherstellen, dass Sie über eine version vonassert()
für die Kompilierung entfernt, um nichts in der release-Version, oder benutzen Sie Ihre eigenenASSERT()
makro-und machen Sie Ihr makro kompilieren Weg zu nichts.InformationsquelleAutor steveha
Ihre beste Wette ist, um zu verwenden, bit-Maskierung, wie Sie erwähnt hatte.
So etwas sollte den trick tun:
InformationsquelleAutor zje
Dies ist die einfachste Funktion zu verwenden, ich will nicht andere zum Kampf für eine lange Zeit, bevor man etwas wie dies hier -
Hoffe es hilft jemandem in Zukunft
InformationsquelleAutor Thomas