Shift-Left-Operator <<

Der Shift-Left-Operator verschiebt die Bits einer Integer-Zahl um eine gegebene Anzahl nach links und füllt die übrigen Bits mit 0 auf. Die zu verändernde Zahl steht links des Operators, die Anzahl an zu verschiebender Bit-Stellen steht rechts des Operators.












01001001100101100000001011010010
10010011001011000000010110100100
00110010110000000101101001000000
#include <stdio.h>

void printbinary(int x){
  char str[33]; str[32] = '\0';
  int i = 32;
  while(i){i--; str[i] = (x & 1) + '0'; x>>=1;}
  printf("%s\n", str);
}

int main(){
  int x = 1234567890;
  printbinary(x);
  printbinary(x << 1);
  printbinary(x << 5);
  return 0;
}

In C++ wird der Shift-Left-Operator zudem oft mit der Ausgabe in einen Stream in Zusammenhang gebracht.

Details

Der Shift-Left-Operator erwartet zwei Operanden als rvalues und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein rvalue, der stets ein Integer-Typ ist.

Der Shift-Left-Operator ist nur für Integer-Werte zulässig. Unter C++ ist zusätzlich auch die Anwendung des Operators auf boolsche Werte erlaubt, welche jedoch vor Anwendung des Operators in einen int umgewandelt werden.

Durch das Verschieben der Bits nach links werden die übrigbleibenden Stellen am rechten Ende mit 0 aufgefüllt. Dies entspricht einem logischen Bitshift in Assembler. Der Shift-Left-Operator wird oftmals mittels SHL abgekürzt.

Ist die Anzahl zu verschiebender Bits negativ oder grösser als die Länge des verwendeten integer-Typs in Bits, so ist das Resultat nicht spezifiziert. Je nach Compiler können andere Resultate entstehen. In GCC beispielsweise wird die Anzahl zu verschiebender Bits als unsigned-Zahl aufgefasst und modulo der Registerbreite in Bits gerechnet, allerdings gibt der Compiler eine Warnung aus.

Die Operatoren << und >> werden hauptsächlich für low-level Programmierung verwendet, wie beispielsweise in der Systemprogrammierung. Da sie einzelne Bits verändern, wird der Umgang mit diesen Operatoren auch häufig als Bit-fiddling (Bit-Schwindeleien, auch zu verstehen als Bit-Gebastel, oder auf gut Schweizerdeutsch: Umegfätterle mit Bittli) bezeichnet. In der alltäglichen Programmierung finden diese beiden Operatoren heutzutage kaum mehr Verwendung.

Eine heute ab und zu noch anzutreffende Verwendung des Shift-Left-Operators ist die Multiplikation einer Zahl mit einer Potenz von 2. Durch die Verschiebung mit 0, 1, 2, 3, ... Bits wird der erste Operand mit 1, 2, 4, 8, ... multipliziert. In früheren Zeiten war dies die bevorzugte Art, Zahlen mit einer Potenz von 2 zu multiplizieren, da ein Bitshift vom Prozessor schneller berechnet werden konnte als eine Multiplikation. In heutigen Prozessoren spielt dies keine Rolle mehr.

42
84
168
336
printf("%d\n", 42 << 0);
printf("%d\n", 42 << 1);
printf("%d\n", 42 << 2);
printf("%d\n", 42 << 3);