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 ???