ECMAScript-Bitoperator

Bit-Operatoren arbeiten auf der Ebene der Nummer (d.h. den 32 Stellen, die die Nummer darstellen).

Über Ganzzahlen wiederholen

ECMAScript Ganzzahlen gibt es in zwei Typen, nämlich signierte Ganzzahlen (die sowohl positive als auch negative Zahlen erlauben) und unsigned Ganzzahlen (nur positive Zahlen erlauben). In ECMAScript sind alle Ganzzahldatenwerte standardmäßig signierte Ganzzahlen, was bedeutet das?

Signierte Ganzzahlen werden mit 31 Stellen dargestellt, um den Wert der Zahl darzustellen, und mit dem 32. Stelle den Zeichen des Ganzzahls darzustellen, 0 für positive und 1 für negative Zahlen. Das Wertebereich reicht von -2147483648 bis 2147483647.

Es gibt zwei verschiedene Arten, um signierte Ganzzahlen in binärem Format zu speichern, eine für positive und eine für negative Zahlen. Positive Zahlen werden im wahren binären Format gespeichert, wobei jedes der ersten 31 Stellen die Potenz von 2 darstellt, beginnend mit dem ersten Stelle (Stelle 0), was 2 darstellt0Der zweite Platz (Stelle 1) stellt 2 dar1Die nicht verwendeten Stellen werden mit 0 gefüllt, d.h. sie werden ignoriert. Zum Beispiel zeigt das folgende Bild die Darstellung der Zahl 18.

32 Bit binär darstellte ganze Zahl

Die binäre Version von 18 verwendet nur die ersten 5 Stellen, die die gültigen Stellen dieser Zahl sind. Konvertieren Sie die Zahl in eine binäre Zeichenkette, um die gültigen Stellen zu sehen:

var iNum = 18;
alert(iNum.toString(2));	// Ausgabe "10010"

Dieser Code gibt nur "10010" aus, nicht die 32-Bit-Repräsentation von 18. Andere Stellen sind unwichtig, da nur die ersten 5 Stellen ausreichen, um diese Dezimalzahl zu bestimmen. Wie im folgenden Bild gezeigt:

5 Bit binär darstellte Zahl 18

Negative Zahlen werden ebenfalls als binäres Code gespeichert, jedoch in Form des Zweierkomplements. Die Schritte zur Berechnung des Zweierkomplements einer Zahl umfassen drei Schritte:

  1. Bestimmen Sie die binäre Darstellung der nichtnegativen Version der Zahl (z.B., um den Zweierkomplement von -18 zu berechnen, müssen Sie zunächst die binäre Darstellung von 18 bestimmen)
  2. Bestimmen Sie die umgekehrte Darstellung des Binärs, indem Sie 0 durch 1 ersetzen und 1 durch 0 ersetzen
  3. Addieren Sie die umgekehrte Darstellung des Binärs

Um die binäre Darstellung von -18 zu bestimmen, muss zunächst die binäre Darstellung von 18 wie folgt erhalten werden:

0000 0000 0000 0000 0000 0000 0001 0010

Zunächst wird die umgekehrte Darstellung des Binärs berechnet, wie folgt:

1111 1111 1111 1111 1111 1111 1110 1101

Schließlich wird auf die umgekehrte Darstellung des Binärs addiert, wie folgt:

1111 1111 1111 1111 1111 1111 1110 1101
                                      1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110

Daher ist die binäre Darstellung von -18 1111 1111 1111 1111 1111 1111 1110 1110. Beachten Sie, dass Entwickler bei der Verarbeitung signierter Integer den Bit 31 nicht erreichen können.

Interessanterweise gibt ECMAScript negative Integer nicht im Format des Zweierkomplements aus, sondern zeigt sie an, indem sie dem Standardbinärcode der numerischen Absolutwert vor einem Minuszeichen hinzufügen. Zum Beispiel:

var iNum = -18;
alert(iNum.toString(2));	// Ausgabe "-10010"

Dieses Code-Snippet gibt "-10010" aus, nicht jedoch den Zweierkomplement, um den Zugriff auf den Bit 31 zu vermeiden. Für die Einfachheit verwendet ECMAScript eine einfache Methode zur Verarbeitung von Integer, sodass Entwickler sich nicht um ihre Verwendung kümmern müssen.

Andererseits behandelt der unsignierte Integer den letzten Bit als einen zusätzlichen Stellenwert. In diesem Muster stellt die 32. Stelle nicht den Vorzeichenwert der Zahl dar, sondern den Wert 2.31Dank dieses zusätzlichen Bits erstreckt sich der Wertebereich unsignierter Integer von 0 bis 4294967295. Für Integer kleiner als 2147483647 erscheinen unsignierte Integer so, als wären sie signierte Integer, während für Integer größer als 2147483647 der Bit 31 (im signierten Integer immer 0) verwendet werden muss.

Wenn ein unsignierter Integer in einen String konvertiert wird, werden nur die gültigen Bits zurückgegeben.

Hinweis:Alle ganzzahligen Literal werden standardmäßig als signierte Integer gespeichert. Nur die Bit-Operatoren von ECMAScript können unsignierte Integer erstellen.

Bit-Operation NOT

Die Bit-Operation NOT wird durch den Negationsstrich (~) dargestellt und ist einer der wenigen Operatoren in ECMAScript, die mit binärem Arithmetic zusammenhängen.

Die Bit-Operation NOT ist ein dreistufiger Prozess:

  1. Konvertiert den Operanden in eine 32-Bit-Zahl
  2. Konvertiert eine binäre Zahl in ihren Dualcode
  3. Konvertiert einen binären Zahl in einen Fließkommazahl

Zum Beispiel:

var iNum1 = 25;		// 25 entspricht 00000000000000000000000000011001
var iNum2 = ~iNum1;	// Konvertiert in 11111111111111111111111111100110
alert(iNum2);		// Ausgabe "-26"

Die Bit-Operation NOT ist im Wesentlichen das Negieren der Zahl und dann das Subtrahieren von 1, daher wird 25 zu -26. Das gleiche Ergebnis kann auch durch folgende Methode erreicht werden:

var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2);	// Ausgabe -26

Bit-Operation AND

Die Bit-Operation AND wird durch das Symbol (&) dargestellt und führt direkt Operationen auf die binäre Form der Zahl durch. Er aligniert die Stellen jeder Zahl und führt die AND-Operation der beiden Stellen an derselben Position gemäß den folgenden Regeln durch:

Stellen der ersten Zahl Stellen der zweiten Zahl Ergebnis
1 1 1
1 0 0
0 1 0
0 0 0

Zum Beispiel, um die Operation AND zwischen den Zahlen 25 und 3 durchzuführen, ist der Code wie folgt:

var iResult = 25 & 3;
alert(iResult);	// Ausgabe "1"

Das Ergebnis der AND-Operation zwischen 25 und 3 ist 1. Warum? Die Analyse ist wie folgt:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001

Es kann ersehen werden, dass in 25 und 3 nur eine Stelle (Stelle 0) gemeinsam den Wert 1 aufweist, daher sind die anderen Stellen mit 0 generiert, sodass das Ergebnis 1 ist.

Bit-Operation OR

Die Bit-Operation OR wird durch das Symbol (|) dargestellt und führt direkt Operationen auf die binäre Form der Zahl durch. Bei der Berechnung jedes Bits verwendet der OR-Operator die folgenden Regeln:

Stellen der ersten Zahl Stellen der zweiten Zahl Ergebnis
1 1 1
1 0 1
0 1 1
0 0 0

Nehmen wir weiterhin das Beispiel mit dem AND-Operator, um 25 und 3 mit OR zu operieren, der Code ist wie folgt:

var iResult = 25 | 3;
alert(iResult);	// Ausgabe "27"

Das Ergebnis der OR-Operation zwischen 25 und 3 ist 27:

25 = 0000 0000 0000 0000 0000 0000 0001 1001
 3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011

Es kann ersehen werden, dass in beiden Zahlen gemeinsam 4 Stellen vorhanden sind, die den Wert 1 aufweisen, diese Stellen werden an das Ergebnis weitergegeben. Der binäre Code 11011 entspricht 27.

Bit-Operation XOR

Der Bit-Operator XOR wird durch das Zeichen (^) dargestellt und natürlich auch direkt auf dem Binärbasierungsformat durchgeführt. XOR ist anders als OR, es gibt nur dann 1 zurück, wenn eine Stelle der 1 enthält. Die Wahrheitstabelle ist wie folgt:

Stellen der ersten Zahl Stellen der zweiten Zahl Ergebnis
1 1 0
1 0 1
0 1 1
0 0 0

Für die XOR-Operation zwischen 25 und 3, der Code lautet:

var iResult = 25 ^ 3;
alert(iResult);	// gibt "26" aus

Das Ergebnis der XOR-Operation zwischen 25 und 3 ist 26:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010

Es ist zu erkennen, dass in zwei Zahlen gemeinsam 4 Stellen sind, die die 1 enthalten, und diese Stellen werden an das Ergebnis weitergegeben. Der Binärcode 11010 entspricht 26.

Linksverschiebeoperator

Der Linksverschiebeoperator wird durch zwei Kleinszeichen dargestellt (<<). Er verschiebt alle Stellen einer Zahl um die angegebene Anzahl nach links. Zum Beispiel, wenn die Zahl 2 (entspricht dem Binär 10) um 5 Stellen nach links verschoben wird, ergibt sich 64 (entspricht dem Binär 1000000):

var iOld = 2;		// entspricht dem Binär 10
var iNew = iOld << 5;	// entspricht dem Binär 1000000 Dezimal 64

Hinweis:Bei der Linksverschiebung der Stellen bleibt eine 5-stellige Leerstelle auf der rechten Seite der Zahl. Der Linksverschiebeoperator füllt diese Leerstellen mit 0 aus, um das Ergebnis zu einer vollständigen 32-Bit-Zahl zu machen.

Die Zahl 2 wird nach links verschoben

Hinweis:Der Linksverschiebeoperator behält den Signifikanten der Zahl bei. Zum Beispiel, wenn -2 um 5 Stellen nach links verschoben wird, erhält man -64, nicht 64. "Wird das Zeichen immer noch im 32. Stellen gespeichert?" Ja, das geschieht jedoch im ECMAScript-Backend und ist für Entwickler nicht direkt zugänglich. Selbst wenn negative Zahlen im Binärbasierungsformat ausgegeben werden, wird der Minuszeichen angezeigt (z.B. wird -2 als -10 angezeigt).

Symbolischer Rechtsverschiebeoperator

Der symbolische Rechtsverschiebeoperator wird durch zwei Grosszeichen dargestellt (>>). Er verschiebt alle Stellen einer 32-Bit-Zahl nach rechts und behält dabei das Zeichen der Zahl (Positiv- oder Negativzeichen) bei. Der symbolische Rechtsverschiebeoperator ist genau umgekehrt zum Linksverschiebeoperator. Zum Beispiel, wenn 64 um 5 Stellen nach rechts verschoben wird, wird es 2:

var iOld = 64;		// entspricht dem Binär 1000000
var iNew = iOld >> 5;	// entspricht dem Binär 10 Dezimal 2

Gleichzeitig entstehen nach der Verschiebung von Stellen Leerstellen. Diesmal befinden sich die Leerstellen auf der linken Seite des numerischen Wertes, aber hinter dem Zeichenplatz.

Die Zahl 64 wird nach rechts verschoben

Unzeichengewordene Rechtsverschiebung

Der unzeichengewordene Rechtsverschiebeoperator wird durch drei Großbuchstaben-Gesichtspunkte (>>>) dargestellt und verschiebt alle Stellen einer unzeichengewordenen 32-bit-Zahl als Ganzes nach rechts. Bei Positiven ist das Ergebnis der unzeichengewordenen Rechtsverschiebung gleich dem der zeichengewordenen Rechtsverschiebung.

Mit dem Beispiel der zeichengewordenen Rechtsverschiebung, wenn 64 um 5 Bits nach rechts verschoben wird, wird es 2:

var iOld = 64;		// entspricht dem Binär 1000000
var iNew = iOld >>> 5;	// entspricht dem Binär 10 Dezimal 2

Bei Negativen ist das anders.

Die unzeichengewordene Rechtsverschiebung füllt alle Leerstellen mit 0. Bei Positiven ist dies gleich dem Verhalten der zeichengewordenen Rechtsverschiebung, während Negative als Positive behandelt werden.

Da das Ergebnis der unzeichengewordenen Rechtsverschiebung ein 32-bitiger Positivzahl ist, erhält man bei der unzeichengewordenen Rechtsverschiebung von Negativen immer eine sehr große Zahl. Zum Beispiel, wenn -64 um 5 Bits nach rechts verschoben wird, erhält man 134217726. Wie erhält man dieses Ergebnis?;

Um dies zu erreichen, muss diese Zahl in eine unsigned equivalente Form umgewandelt werden (obwohl die Zahl selbst noch signifikant ist), die durch folgenden Code erhalten werden kann:

var iUnsigned64 = -64 >>> 0;

Dann erhalten Sie mit toString() vom Number-Typ die tatsächliche Bitdarstellung, die Basis ist 2:

alert(iUnsigned64.toString(2));

Dies ergibt 11111111111111111111111111000000, das binäre Komplement des Ganzzahls -64, das jedoch dem unzeichengewordenen Ganzzahl 4294967232 entspricht.

Aus diesem Grund ist Vorsicht bei der Verwendung des unzeichengewordenen Rechtsverschiebeoperators geboten.