C++ Kurs

Bit- und Schiebeoperationen

Die Themen:

Wurden bisher nur arithmetische Operationen betrachtet, welche ein Datum als Ganzes verarbeiten, so bietet C++ auch die Möglichkeit, einzelne Bits von Ganzzahlen mit Hilfe von Bitoperationen zu verarbeiten.

Da Bitoperationen nur auf Ganzzahlen zulässig sind, können mit ihnen, unter der Annahme, dass ein char 8 Bits enthält, sizeof(char)*8, sizeof(short)*8, sizeof(int)*8, sizeof(long)*8 Bits oder sizeof(long long)*8 Bits gleichzeitig beeinflusst werden, abhängig davon, ob die Bitoperation auf einen char, short, int, long oder long long Datentyp angewandt wird. Bis auf den Bitoperator 'rechts schieben' arbeiten alle Bit- und Schiebeoperatoren vorzeichenunabhängig, d.h. sie wirken auf signed und unsigned Daten gleich.

HinweisBitoperationen sind binäre Operationen, d.h. die Ganzzahl wird hier als eine Kombination von 0 und 1 Bits ausgewertet.

Bevor es gleich mit den Operationen losgeht, nochmals zur Wiederholung die binäre Darstellung von Ganzzahlen anhand einer unsigned char Variablen (Annahme: char gleich 8 Bits).

Wert: 10 => hex: 0x0A => binär: 0000 1010
Wert: 240 => hex: 0xF0 => binär: 1111 0000
Wert: 131 => hex: 0x83 => binär: 1000 0011

Bitoperationen

Um einzelne Bits einer Ganzzahl zu beeinflussen, stehen die folgenden Bitoperationen zur Verfügung:

UND-Operation

Zwei Operanden werden durch den Operator & UND-verknüpft.

ERG = OP1 & OP2;

Die UND-Verknüpfung liefert als Ergebnis nur an den Stellen ein 1-Bit, an denen beiden Operanden ein 1-Bit besitzen.

Beispiel:

OP1   OP2   ERG
0x26 (0010 0110) & 0x23 (0010 0011) => 0x22 (0010 0010)
0x45 (0100 0101) & 0x0F (0000 1111) => 0x05 (0000 0101)

ODER-Operation

Zwei Operanden werden durch den Operator | ODER-verknüpft.

ERG = OP1 | OP2;

Die ODER-Verknüpfung liefert als Ergebnis an den Stellen ein 1-Bit, an denen mindestens einer der Operanden ein 1-Bit besitzt.

Beispiel:

OP1   OP2   ERG
0x26 (0010 0110) | 0x23 (0010 0011) => 0x27 (0010 0111)
0x45 (0100 0101) | 0x0F (0000 1111) => 0x4F (0100 1111)

EXKLUSIV-ODER Operation

Zwei Operanden werden durch den Operator ^ EXKLUSIV-ODER-verknüpft.

ERG = OP1 ^ OP2;

Die EXKLUSIV-ODER Verknüpfung liefert als Ergebnis an den Stellen ein 1-Bit, an denen beide Operanden unterschiedliche Bits besitzen.

HinweisSollten Sie Schwierigkeiten haben das Symbol ^ für den Exklusiv-Oder Operator zu finden: es befindet sich auf der deutschen Tastatur neben der 1-Taste. Um das Symbol ^ zu erhalten, drücken Sie zuerst die Taste ^ und dann die Leertaste!

Beispiel:

OP1   OP2   ERG
0x26 (0010 0110) ^ 0x23 (0010 0011) => 0x05 (0000 0101)
0x45 (0100 0101) ^ 0x0F (0000 1111) => 0x4A (0100 1010)

NEGATION-Operation (1er Komplement)

Für die Invertierung aller Bits eines Operanden wird der Operator ~ verwendet.

ERG = ~OP;

Das Ergebnis enthält an den Stellen ein 1-Bit, an denen der Operand ein 0-Bit besitzt und umgekehrt. Man bezeichnet diese Operation auch als Bildung des 1er-Komplements.

Beispiel:

OP   ERG
~0x26 (0010 0110 => 0xD9 (1101 1001)
~0x45 (0100 0101) => 0xBA (1011 1010)

Schiebeoperationen

Außer den Bitoperationen stellt C++ auch noch Operatoren zur Verfügung, um die Bits einer Ganzzahl um eine bestimmte Anzahl von Positionen nach links oder rechts zu schieben.

SHIFT-LEFT Operation

Die Bits eines Operanden können mit Hilfe des Operators << um eine definierte Anzahl von Positionen nach links geschoben werden. Die Anzahl der Positionen, um die geschoben werden soll, muss positiv sein.

ERG = OP << BITS;

Die rechts frei werdenden Bits werden mit 0 aufgefüllt und Überläufe werden verworfen.

Beispiel:

OP   BITS   ERG
0x26 (0010 0110) << 2 => 0x98 (1001 1000)
0x45 (0100 0101) << 4 => 0x50 (0101 0000)

SHIFT-RIGHT Operation

Die Bits eines Operanden können mit Hilfe des Operators >> um eine definierte Anzahl von Positionen nach rechts geschoben werden. Und auch hier muss die Anzahl der Positionen, um die geschoben werden soll, positiv sein.

ERG = OP >> BITS;

Ist die Ganzzahl vorzeichenlos (unsigned), werden die links frei werdenden Bits mit 0 aufgefüllt. Bei positiven vorzeichenbehafteten Zahlen werden die frei werdenden Bits ebenfalls mit 0 aufgefüllt.

AchtungBei negativen Zahlen ist das Verhalten lt. ANSI C++ implementierungsabhängig. In der Regel werden die freiwerdenden Bits aber mit dem Vorzeichenbit (höchstwertiges Bit, bei negativen Zahlen gleich '1') aufgefüllt.

Beispiel:

OP BITS ERG
0x26 (0010 0110) >> 2 => 0x09 (0000 1001)
0x45 (0100 0101) >> 4 => 0x04 (0000 0100)

Kurzschreibweisen

Genauso wie bei den Grundrechenoperationen, stehen auch für die Bit- und Schiebeoperationen entsprechende Kurzschreibweisen zur Verfügung, die in der nachfolgenden Tabelle aufgeführt sind.

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 

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.