Bit lesen und "extrahieren"
-
Hallo !
Erstens sollte gesagt sein, dass Bitmanipulation noch recht ungewohnt für mich ist und mich nicht so gut damit auskenne (es wird auch leider nur in einem Kapitel in meinem C++ Buch behandelt). Es gibt zum Beispiel schon ein Problem mit dem Begriff Wort/Wortlänge. Bezeichnet das jetzt die CPU mit den Anzahl der Bits oder bezieht sich das nur ein Byte in einem Computer ?
Also, eine Wortlänge == 32 Bit in ein Std-PC-Cpu (Intel Pentium) oder da ein Byte == 8 Bit == eine Wortlänge ?Nur aber zu meiner eigentlichen Frage:
Ich möchte aus einer Ganzzahl int/long (beide unsigned) einmal die n niederwertigsten Bits und auch die n höherwertigsten Bits "extrahieren". N steht hierbei für 1,2,3,4.
Was ich weiß ist, das die niederwertigen Bits rechts (0, 1, ...) sind und die höherwertigen links (7, 6, ...), also ich müsste ich doch für die niederwert. Bits ein "<<" (Linksshift) und für die h.-Bits ein ">>" (Rechtsshift) anwenden oder komplett falsch ?P.S.: Weiß jemand ob es Tutorials zur Bitmanipulatin gibt, wo alle ganz genau beschrieben wird ?
-
die wortlaenge ist die anzahl der bits, die die cpu gleichzeitig
verarbeiten kann.
das sind bei den aktuellen ibm-kompatiblen cpus 32-bit(=wortlaenge).wenn du die bits extrahieren willst, kannst du mit bitmasken arbeiten:
int bitmaske = 0xffff0000; // maske zum entfernen der niederwertigen bits int zahl = 123456789; // extrahiert enthaelt nur noch die hoeherwertigen bits von zahl // die niederwertigen sind durch den & operator und die maske // entfernt worden int extrahiert = (zahl & bitmaske);
fuer die hoeherwertigen bits musst du als maske 0x0000ffff nehmen.
das ist natuerlich nur so lange richtig, wie du eine wortlaenge von
32 hast.das 0x0000ffff ist hexadezimal. je zwei zahlen stehen fuer ein bit, also:
0x00 = 0000 0000 // 1 byte
0x00 00 = 0000 0000 0000 0000 // 2 byte0x11 = 1111 1111
usw.
-
Steht in den FAQ sicher was zu.
-
Müßte 0x11 nicht 0001 0001 und 1111 1111 = 0xFF sein ?
-
Herzlichen Dank. Das ist schon einmal sehr hilfreich.
Wenn ich jetzt eine Zahl "in Bits" darstellen möchte und von einer Wortlänge von 32 Bit ausgehe, ist dann folgender Code korrekt ?
void showbits(unsigned int nZahl) { register int i = 0; for (i = 31; i >= 0; --i) { cout << (char) ( ((nZahl >> i) & 1) + '0'); if ( i % 4 == 0 && i > 0) // alle 4 "Bits" ein Leerzeichen cout << ' '; } }
-
Warum probierst du es nicht aus? Und warum "register int"?
-
0xFF schrieb:
Müßte 0x11 nicht 0001 0001 und 1111 1111 = 0xFF sein ?
aeh jo.
die vielen 0en und 1en haben mich total verwirrt...
also: 0xff=1111 1111der code sieht ok aus.
etwas verwirrend finde ich aber:for ( i = 31; i >= 0
schreib vielleicht besser
for ( i = 32; i > 0
da sieht man gleich wie oft die schleife durchlaufen wird...
nur so nebenbei: die stl bietet auch eine klasse bitset.
die koenntest du dir mal anschauen...