Logische Verschiebung
Sprache | Links | Rechts |
---|---|---|
ARM-Assembler | lsl |
lsr
|
C++ (nur vorzeichenlose Typen) | << |
>>
|
C (nur vorzeichenlose Typen) | << |
>>
|
Delphi | shl |
shr
|
Java | << |
>>
|
Ocaml | lsl |
lsr
|
Standard ML | << |
>>
|
Verilog | << |
>>
|
VHDL | sll |
srl
|
JavaScript | << |
>>
|
Unter einer logischen Verschiebung (engl. logical shift) versteht man in der Informatik einen bitweisen Operator, der alle Bits des Operanden verschiebt. Die logische im Gegensatz zur arithmetischen Verschiebung erhält weder das Vorzeichenbit noch unterscheidet sie zwischen dem Exponenten und der Mantisse einer Zahl. Jedes Bit des Operanden wird einfach um eine gegebene Positionsanzahl verschoben und die entstehenden Bit-Positionen werden, in der Regel mit Nullen, aufgefüllt.
Eine logische Verschiebung wird oft genutzt, wenn der Operand als Sequenz von Bits und nicht als Zahl betrachtet wird.
Logische Verschiebungen können ein sinnvoller und effizienter Weg sein, Multiplikationen oder Divisionen von vorzeichenlosen Integer-Zahlen (Ganzzahlen) zur zweiten Potenz durchzuführen. Eine Verschiebung nach links um n Bits bei einer vorzeichenlosen oder vorzeichenbehafteten binären Zahl hat den Effekt einer Multiplikation mit 2n. Verschieben nach rechts um n Bits bei einer vorzeichenlosen binären Zahl ist gleichbedeutend mit dem Dividieren durch 2n (und anschließendem Abrunden).
Weil sich arithmetische Verschiebungen und logische Verschiebungen nach rechts unterscheiden, haben viele Programmiersprachen verschiedene Operatoren für sie. So ist der arithmetische Shift-Operator bei Java und JavaScript zum Beispiel >>
; wohingegen der logische Rechtsshift >>>
ist. Java allein hat nur einen Linksshift-Operator (<<
), weil arithmetische und logische Verschiebung denselben Effekt haben.
Die Sprache C wieder kennt nur einen Rechtsshift-Operator >>
. Viele C-Compiler entscheiden die Art der Rechtsverschiebung danach, welcher Integer-Datentyp verschoben werden soll; oft werden vorzeichenbehaftete Ganzzahlen arithmetisch verschoben und vorzeichenlose logisch.
Beispiel
[Bearbeiten | Quelltext bearbeiten]Folgende Bit-Sequenz soll logisch um 1 Bit verschoben werden: 0001 0111 (siehe Bilder)
- …nach links ergibt: 0010 1110
- …nach rechts ergibt: 0000 1011