Bit- und Schiebeoperationen
Die Bit- und Schiebeoperationen wirken auf die einzelnen Bits eines Integer-Datums. Bis auf den Schiebeoperator rechts schieben arbeiten alle Bit- und Schiebeoperatoren vorzeichenunabhängig, d.h., sie wirken auf signed und unsigned Daten gleich.
Nachfolgend zum Einstieg die binäre Darstellung von unsigned char-Daten (Annahme: char gleich 8 Bits).
| Wert | in hex | in binär |
|---|---|---|
| 10 | 0x0a | 0000'1010 |
| 240 | 0xF0 | 1111'0000 |
| 131 | 0x83 | 1000'0011 |
Bitoperationen
Um einzelne Bits eines Integer-Datums zu beeinflussen, stehen die folgenden Bitoperationen zur Verfügung:
| Operator | Syntax | Ergebnis |
|---|---|---|
| & | EXP1 & EXP2; | Liefert an den Stellen eine ‘1’ an der EXP1 und EXP2 eine ‘1’ besitzen. |
| | | EXP1 | EXP2; | Liefert an den Stellen eine ‘1’ an der EXP1 oder EXP2 eine ‘1’ besitzen. |
| ^ | EXP1 ^ EXP2; | Liefert an den Stellen eine ‘1’ an der EXP1 und EXP2 unterschiedliche Bits haben. |
| ~ | ~EXP; | Invertiert alle Bits von EXP. |
Sollten Sie Schwierigkeiten haben das Symbol ^ für den Exklusiv-Oder-Operator zu finden: Es befindet sich auf der deutschen Tastatur neben der Taste 1. Um das Symbol ^ zu erhalten, drücken Sie zuerst die Taste ^ und dann die Leertaste.
Beispiele:
| EXP1 | OP | EXP2 | Ergebnis |
|---|---|---|---|
| 0x26 (0010 0110) | & | 0x23 (0010 0011) | 0x22 (0010 0010) |
| 0x45 (0100 0101) | | | 0x0F (0000 1111) | 0x4F (0100 1111) |
| 0x26 (0010 0110) | ^ | 0x23 (0010 0011) | 0x05 (0000 0101) |
| ~ | 0x45 (0100 0101) | 0xBA (1011 1010) |
Schiebeoperationen
Schiebeoperationen schieben die Bits eines Integer-Datums um x Stellen nach links oder rechts. Die Anzahl der Stellen muss positiv sein.
| Operator | Syntax | Ergebnis |
|---|---|---|
| << | EXP1 << EXP2; | Schiebt die Bits in EXP1 um EXP2 Positionen nach links |
| >> | EXP1 >> EXP2; | Schiebt die Bits in EXP1 um EXP2 Positionen nach rechts |
Beim Schieben werden die freiwerdenden Bits mit 0 aufgefüllt und ein eventueller Überlauf verworfen.
Beispiele:
| EXP1 | OP | EXP2 | Ergebnis |
|---|---|---|---|
| 0x26 (0010 0110) | << | 2 | 0x98 (1001 1000) |
| 0x45 (0100 0101) | >> | 4 | 0x04 (0000 0100) |
Beim Schieben von negativen Daten nach rechts ist das Verhalten lt. ANSI C++ implementierungsabhängig. In der Regel werden die frei werdenden Bits mit dem Vorzeichenbit (höchstwertiges Bit, bei negativen Zahlen gleich '1') aufgefüllt.
Kurzschreibweisen
Für Bit- und Schiebeoperationen stehen folgende Kurzschreibweisen zur Verfügung:
| x &= y | x = x & y |
| x |= y | x = x | y |
| x ^= y | x = x ^ y |
| x <<= y | x = x << y |
| x >>= y | x = x >> y |
Übungen
bshift_01
Definieren Sie eine unsigned short Konstante CFIX und initialisieren sie mit dem Hex-Wert 0xAA55.
Geben Sie von CFIX das High-Byte und das Low-Byte aus.
Eine unsigned short Konstante besteht aus 2 Bytes. Diese Bytes sind durch Schieben und Ausmaskieren (logische Verundung mit einer Bitkombination) zu extrahieren.
Bilden Sie durch Schiebeoperationen die 2er Potenzen im Bereich 20 bis 23.
Dividieren Sie die Zahl 244 mittels einer Schiebeoperation durch 8
High-Byte von 0xaa55: 0xaa
Low-Byte von 0xaa55: 0x55
2 hoch 0: 1
2 hoch 1: 2
2 hoch 2: 4
2 hoch 3: 8
244/8: 30
bshift_02
Definieren Sie eine char-Konstante CFIX und dem Wert 0x55.
Die Konstante CFIX ist in ihrer binären Darstellung auszugeben, d.h. zerlegt in ihre 0 und 1 Bits. Es sind nur Schiebe- und Bitoperationen zu verwenden.
Definieren Sie eine short-Variable shortVar und initialisieren Sie mit dem Wert 10.
Bilden Sie das 1er-Komplement (Invertierung aller Bits) von der Variable shortVar und geben es aus.
Inkrementieren Sie das 1er-Komplement und geben das Ergebnis aus. Welche Zahl wird angezeigt?
0x55 ist binaer 01010101
Das 1er Komplement von 10 ist ???
Und eins dazu addiert ergibt ???