Bitweise Operatoren wurden in die Programmiersprache C aufgenommen, um die Arbeit mit Daten und Hardware auf niedriger Ebene zu erleichtern: Einstellen von Registern, Maskierung, Multiplikation und Division durch Potenzen von zwei. Die Regeln zu ihrer Verwendung wurden bereits in der Zeit von 8- und 16-Bit-Prozessoren festgelegt.
Häufig gibt es Fehler beim Shiften von signed-Typen, da das Ergebnis von der Implementierung abhängt (arithmetischer oder logischer Shift) und auch, wenn man über die Grenzen der Typgröße hinausgeht. Fehler können Datenbeschädigung, falsche Berechnungen und undefiniertes Verhalten verursachen.
Linksverschiebung (<<): entspricht der Multiplikation des Wertes mit 2 hoch k (a << k). Füllt immer Nullen rechts auf.
Rechtsverschiebung (>>): für unsigned-Werte werden links Nullen aufgefüllt (logischer Shift), und für signed kann entweder mit dem Vorzeichenbit (arithmetischer Shift) oder mit Nullen aufgefüllt werden (das Verhalten hängt vom Compiler ab).
Beispiel:
unsigned int x = 5; // 0000 0101 unsigned int y = x << 1; // 0000 1010 == 10 int z = -4; // 1111 1100 (wenn 8 Bit) int w = z >> 1; // Kann 1111 1110 (-2) oder 0111 1110 bleiben (abhängig von der Implementierung)
Wichtige Merkmale:
Was passiert beim Rechtsverschieben einer negativen Zahl mit >>?
Das Ergebnis hängt von der Implementierung ab: meistens ist es ein arithmetischer Shift, der das Vorzeichen beibehält, aber der Standard garantiert das nicht!
Wie viel beträgt das Ergebnis bei einer Verschiebung um mehr als die Bitanzahl des Typs?
Undefiniertes Verhalten. Zum Beispiel kann 1 << 32 für einen 32-Bit-Typ alles Mögliche ergeben oder sogar das Programmverhalten stören.
Kann man bitweise Operatoren für Gleitkommazahlen verwenden?
Nein, die Standardtypen float, double unterstützen keine bitweisen Operationen. Nur ganzzahlige Typen.
Ein Programmierer hat einen int um 32 verschoben, um eine Maske zu erstellen — auf einigen Plattformen führte dies zu Null, auf anderen zu einem nicht erkennbaren Wert.
Vorteile:
Nachteile:
Stattdessen wurden unsigned-Werte und Maskierung der Anzahl der Bits mit Makros, klarer Dokumentation und Prüfung der Typlänge über sizeof verwendet.
Vorteile:
Nachteile: