4.5    Bitoperatoren

Für den direkten Zugriff auf die binäre Darstellung für Ganzzahlen können Sie auf die Bitoperatoren zurückgreifen. In Tabelle 4.5 finden Sie eine Übersicht, welche Bitoperatoren es gibt. Alle stehen, wie schon die arithmetischen Operatoren, auch in einer erweiterten Schreibweise zur Verfügung.

Bitoperator

Erweitert

Bedeutung

&

&=

bitweise UND-Verknüpfung (and)

|

|=

bitweise ODER-Verknüpfung (or)

^

^=

bitweises XOR

~

bitweises Komplement

>>

>>=

Rechtsverschiebung

<<

<<=

Linksverschiebung

Tabelle 4.5    Übersicht über die bitweisen Operatoren

Bitoperatoren und Fließkommazahlen

Die Operanden für die Verwendung mit Bitoperatoren müssen normalerweise immer ganzzahlige Datentypen sein. float oder double sollten also hier nicht als Operanden verwendet werden. Sie können natürlich mit Zeigern und dem hier später noch besprochenen Typecasting praktisch alles in alles konvertieren, jedoch steht Ihnen dann der Compiler nicht mehr bei, und Sie sind ganz auf sich allein gestellt.

Bitweise Operatoren können nützlich sein, wenn Sie beispielsweise in einem Programm eine Zahl darauf testen wollen, ob ein bestimmtes Bit gesetzt ist, oder wenn Sie gezielt einzelne Bits setzen oder löschen möchten. Wie Sie dies bewerkstelligen, wird im Folgenden erklärt.

Bitweises UND

Ein bitweises UND wird durch das &-Zeichen repräsentiert. Das bitweise UND überprüft zwei Bitfolgen und führt eine logische UND-Verknüpfung durch. Das bedeutet, wenn beim Paar der Verknüpfung beide Bits 1 sind, ist das Ergebnis-Bit ebenfalls 1. Ansonsten ist das Ergebnis-Bit 0. Diese UND-Verknüpfung eignet sich relativ gut, um bestimmte Bits in Bitmustern zu löschen. Ein Beispiel hierzu wäre:

unsigned int val = 5; // Bitmuster:0101
unsigned int ret = val & 3 // Bitmuster:0011

Hier wurden also die letzten zwei Bits der Zahl 5 beibehalten, und der Rest wurde ausgeblendet:

   0101  (5)
& 0011 (3)
------------
0001 (1)

Folgende Regeln gelten für den bitweisen UND-Operator (siehe Tabelle 4.6).

Bit A

Bit B

Ergebnisbit

0

0

0

0

1

0

1

0

0

1

1

1

Tabelle 4.6    Regeln für die bitweise UND-Verknüpfung

Bitweises ODER

Wenn Sie den bitweisen-ODER-Operator | auf zwei gleich lange Bitfolgen anwenden, werden die Bitpaare durch ein logisches ODER verknüpft. Das bedeutet, dass wenn bei mindestens einem der beiden Bitpaare das entsprechende Bit 1 ist, auch das Ergebnisbit 1 lautet. Damit ist der bitweise ODER-Operator das Gegenstück zum UND-Operator, mit dem Sie einzelne Bits in Bitmustern setzen können. Das Beispiel 5|3 sieht mit diesem Operator wie folgt aus:

   0101  (5)
| 0011 (3)
------------
0111 (7)

Folgende Regeln gelten daher für den bitweisen ODER-Operator (siehe Tabelle 4.7).

Bit A

Bit B

Ergebnisbit

0

0

0

0

1

1

1

0

1

1

1

1

Tabelle 4.7    Regeln für bitweise ODER-Verknüpfung

Bitweises XOR

Anders als der bitweise ODER-Operator liefert das bitweise XOR (oder auch exklusive ODER) als Endergebnis zweier Bitfolgen 1 zurück, wenn beide Bits unterschiedlich sind. Der exklusive ODER-Operator eignet sich daher sehr gut, um spezielle Bits quasi umzuklappen. Selbstredend kommt wieder die Ausgangszahl heraus, wenn man die gleiche XOR-Operation zweimal anwendet:

   0101  (5)
^ 0011 (3)
------------
0110 (6)
^ 0011 (3)
------------
0101 (5)=Ausgangswert

Folgende Regeln gelten für den bitweisen XOR-Operator (siehe Tabelle 4.8).

Bit A

Bit B

Ergebnisbit

0

0

0

0

1

1

1

0

1

1

1

0

Tabelle 4.8    Regeln für bitweise XOR-Verknüpfung

Bitweises Komplement

Der NOT-Operator (~) wirkt sich auf Zahlen so aus, dass er jedes einzelne Bit invertiert, also umdreht. Aus einer 1 wird eine 0 und aus der 0 eine 1. Bei vorzeichenbehafteten Datentypen entspricht das einer Negation mit anschließender Subtraktion von 1. Dies ist so, weil normalerweise das höchste Bit das Vorzeichenbit ist. Für die NOT-Verknüpfung gilt Tabelle 4.9.

BitA

~BitA

0

1

1

0

Tabelle 4.9    Regeln einer bitweisen NOT-Verknüpfung

Links- bzw. Rechtsverschiebung (Shift-Operatoren)

Mit einer Linksverschiebung (<<) bzw. Rechtsverschiebung (>>) werden alle Bits einer Zahl um n Stellen nach links gerückt. Die rechts oder links entstehenden Leerstellen werden mit 0 aufgefüllt. Beispielsweise ist 3<<1:

      0011  (3)
<<1 0110 (6)

Hier haben Sie quasi eine Multiplikation mit 2 durchgeführt. Dies gilt allerdings nicht für alle Prozessoren, denn es gibt auch Systeme, auf denen sich die Sache umgekehrt verhält und das höchstwertige Bit rechts steht. Normalerweise verwenden Sie jedoch in Ihrem PC oder auch in Ihrem Pi Prozessoren, bei denen das höchstwertige Bit links steht. Wenn das höchstwertige Bit links steht, haben Sie einen Little-Endian-Prozessor, wenn das höchstwertige Bit rechts steht, haben Sie einen Big-Endian-Prozessor. Dieses Buch bezieht sich stets auf die erste Variante, bei der das höchstwertige Bit links steht, aber Sie müssen eventuell umdenken, wenn sie z. B. für spezielle Smartphones, wie z. B. die von Motorola, Apps programmieren wollen.