Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 90
4.8.3Bitweise Operatoren
ОглавлениеDie bitweisen Operatoren (oder kurz Bit-Operatoren) führen elementare Manipulationen der Bits in der Binärrepräsentation von Zahlen durch. Obwohl sie keine klassischen arithmetischen Operationen ausführen, werden sie hier unter die arithmetischen Operatoren eingereiht, weil sie auf numerischen Operanden operieren und einen numerischen Wert liefern. Vier dieser Operanden führen boolesche Algebra auf den einzelnen Bits der Operanden aus und verhalten sich, als wären die einzelnen Bits des Operanden jeweils boolesche Werte (1 = wahr, 0 = falsch). Die anderen drei Bit-Operatoren werden genutzt, um Bits nach links oder rechts zu verschieben. In der JavaScript-Programmierung werden diese Operatoren nicht sehr häufig verwendet. Wenn Sie mit der binären Darstellung von Integern einschließlich der Zweierkomplement-Darstellung negativer Ganzzahlen nicht vertraut sind, können Sie den Teilabschnitt zu Verschiebungsoperatoren auch einfach überspringen.
Die bitweisen Operatoren erwarten ganzzahlige Operanden und verhalten sich, als würden diese Werte als 32-Bit-Ganzzahlwerte und nicht als 64-Bit-Gleitkommawerte repräsentiert. Sie wandeln ihre Operanden bei Bedarf in Zahlen um und zwingen die numerischen Werte dann in ein 32-Bit-Ganzzahlformat, indem alle Bruchteile und Bits nach dem 32. Bit fallen gelassen werden. Die Verschiebungsoperatoren verlangen auf der rechten Seite einen Operanden zwischen 0 und 31. Nachdem dieser Operand in eine vorzeichenlose 32-Bit-Ganzzahl umgewandelt wurde, werden alle Bits nach dem 5. fallen gelassen, um einen Wert im entsprechenden Bereich zu erhalten. Überraschenderweise werden NaN, Infinity und -Infinity alle in 0 umgewandelt, wenn sie als Operanden eines Bit-Operators verwendet werden.
Alle bitweisen Operatoren – außer >>> – können mit regulären Zahlenoperanden oder mit BigInt-Operanden verwendet werden (siehe 3.2.5).
Bitweises UND (AND) (&)
Der &-Operator führt eine logische UND-Operation auf allen Bits seiner ganzzahligen Operanden durch. Im Ergebnis wird ein Bit nur dann gesetzt, wenn das entsprechende Bit in beiden Operanden gesetzt ist. 0x1234 & 0x00FF ergibt beispielsweise 0x0034.
Bitweises ODER (OR) (|)
Der |-Operator führt eine logische ODER-Operation auf allen Bits seiner ganzzahligen Operanden durch. Im Ergebnis wird ein Bit gesetzt, wenn das entsprechende Bit in einem oder in beiden Operanden gesetzt ist. 0x1234 | 0x00FF ergibt beispielsweise 0x12FF.
Bitweises XODER (XOR) (^)
Der ^-Operator führt eine exklusive logische ODER-Operation, also eine XODER-Operation, auf den einzelnen Bits seiner ganzzahligen Operanden durch. Exklusives ODER heißt, dass ein Bit entweder im ersten Operanden oder im zweiten Operanden wahr ist, aber nicht in beiden. Im Ergebnis der Operation wird ein Bit gesetzt, wenn das entsprechende Bit in einem (aber nicht in beiden) Operanden gesetzt ist. 0xFF00 ^ 0xF0F0 ergibt beispielsweise 0x0FF0.
Bitweises NICHT (NOT) (~)
Der ~-Operator ist ein unärer Operator, der vor einem ganzzahligen Operanden erscheint. Er bewirkt, dass alle Bits im Operanden umgekehrt werden. Aufgrund der Art, in der Ganzzahlen mit Vorzeichen in JavaScript repräsentiert werden, erzeugt die Anwendung des ~-Operators auf einen Wert das gleiche Ergebnis, als würde sein Vorzeichen geändert und dann 1 vom Zwischenergebnis abgezogen. Zum Beispiel wird ~0x0F zu 0xFFFFFFF0 bzw. –16 ausgewertet.
Verschiebung nach links (<<)
Der <<-Operator verschiebt alle Bits in seinem ersten Operanden um die Anzahl von Stellen nach links, die durch den zweiten Operanden angegeben werden, der eine ganze Zahl zwischen 0 und 31 sein muss. Zum Beispiel wird in der Operation a << 1 das erste Bit (das Einer-Bit) von a zum zweiten Bit (dem Zweier-Bit), das zweite Bit von a zum dritten usw. Für das neue Bit wird eine Null verwendet, und der Wert des 32. Bits geht verloren. Eine Verschiebung um eine Position nach links entspricht einer Multiplikation mit 2, eine Verschiebung von zwei Positionen einer Multiplikation mit 4 und so weiter. Beispielsweise wird 7 << 2 zu 28 ausgewertet.
Verschiebung nach rechts mit Vorzeichen (>>)
Der >>-Operator verschiebt alle Bits in seinem ersten Operanden um die durch den zweiten Operanden angegebenen Stellen nach rechts. (Der zweite Operand ist dabei eine ganze Zahl zwischen 0 und 31.) Bits, die nach rechts hinausgeschoben werden, gehen verloren. Wie die neuen Bits auf der linken Seite gefüllt werden, hängt vom Vorzeichen des ursprünglichen Operanden ab, damit das Vorzeichen im Ergebnis bewahrt bleibt. Ist der erste Operand positiv, werden die neuen hohen Bits mit Nullen aufgefüllt. Ist der erste Operand negativ, werden die neuen hohen Bits mit Einsen aufgefüllt. Eine Verschiebung um eine Position nach rechts entspricht einer ganzzahligen Division durch 2 (wobei der Rest verworfen wird), eine Verschiebung um zwei Stellen einer restlosen Division durch 4 und so weiter. 7 >> 1 ergibt beispielsweise 3, -7 >>1 dagegen –4.
Verschiebung nach rechts mit Nullauffüllung (>>>)
Der >>>-Operator entspricht dem >>-Operator, allerdings werden die nach links verschobenen Bits immer mit null gefüllt, unabhängig vom Vorzeichen des ersten Operanden. Dies ist hilfreich, wenn Sie 32-Bit-Werte mit Vorzeichen so behandeln wollen, als wären sie vorzeichenlose Ganzzahlen. -1 >> 4 wird beispielsweise zu –1 ausgewertet, aber -1 >>> 4 zu 0x0FFFFFFF. Das ist der einzige der bitweisen JavaScript-Operatoren, der nicht mit BigInt-Werten verwendet werden kann. BigInt stellt negative Zahlen nicht dar, indem das hohe Bit wie bei 32-Bit-Integern gesetzt wird, der >>>-Operator ist aber nur zur Darstellung des Zweierkomplements sinnvoll.