Es gibt 7 bitweise Operatoren in JavaScript, nämlich &, |, ^, ~, <<, >>, >>> (C# hat diesen Operator nicht, aber C# kann >> ; logische Rechtsverschiebung zur Implementierung dieser Operation), die Bitoperationen werden alle binär ausgeführt.
Bitweiser UND-Operator (&)
Gibt 1 zurück, wenn die gleichen Bits in den beiden Zahlen 1 sind, andernfalls wird 0 zurückgegeben, zum Beispiel 1&2=0, die binäre Darstellung von 1 ist 0001, 2 Die binäre Darstellung von ist 0010, und die Operation zwischen den beiden gibt 0000 zurück.
Bitweiser ODER-Operator (|)
Gibt 1 zurück, wenn zwei Zahlen dieselbe Ziffer, aber unterschiedliche Ziffern haben, andernfalls wird 0 zurückgegeben, zum Beispiel 1|2=3.
Bitweiser XOR-Operator (^)
Gibt 1 zurück, wenn nur eine der beiden Zahlen das gleiche Bit 1 hat, andernfalls wird 0 zurückgegeben, zum Beispiel 1^2=3.
Der bitweise NICHT-Operator (~)
~ ist ein unärer Operator, der alle Bits negiert. Zunächst müssen wir über die Speicherung negativer Zahlen sprechen. Wenn wir Operationen an negativen Zahlen durchführen, müssen wir daher deren binäre Kodierung, dh die Zweier, korrekt erhalten Komplement ihrer positiven Zahlen. Das Komplement wird durch Invertieren und anschließendes Addieren von 1 realisiert. Schauen wir uns das folgende Beispiel an:
Berechnen Sie zunächst das Komplement von 3: Die binäre Form von 3 ist 00000011, ihr Komplement ist 11111100 und ihr Komplement ist 11111101. also -3 Der Binärcode von ist 11111101, dann benötigen wir ~-3, das heißt, es nimmt sein Komplement, das 00000010 ist. Dies ist das Komplement von -3 und konvertiert es in die Dezimalzahl 2.
Wenn Sie es noch ein paar Mal versuchen, werden Sie feststellen, dass das Komplement einer Zahl tatsächlich ihr dezimales Gegenteil minus 1 ist.
Linksverschiebungsoperator (<<)
Der Linksverschiebungsoperator verschiebt alle Bits der Zahl gemeinsam nach links, und das erste Bit wird zum zweiten Bit und das zweite Bit wird Dritter. . . Die frei gewordenen neuen Bits werden mit Nullen aufgefüllt. Beispiel: 1 < Die binäre Darstellung von ist 1111 1111. Verschieben Sie sie um zwei Stellen nach links, um 1111 1100 zu erhalten. Die Zahl, die mit 1 beginnt, ist eine negative Zahl. Um sie in eine Dezimalzahl umzuwandeln, müssen Sie eine Komplementrechnung rückwärts durchführen , das heißt, subtrahiere zuerst 1, um 1111 1011 zu erhalten, negiere es dann, um 0000 0100 zu erhalten, wandele es in eine Dezimalzahl um und füge ein negatives Vorzeichen hinzu, um 4 zu erhalten. Hier müssen Sie auf den binären Subtraktionsalgorithmus achten: 1-1=0-0=0, 1-0=1, 0-1=1 (vom High-Bit entlehnen).
Hier können wir feststellen, dass die Linksverschiebung darin besteht, die Dezimalzahl mit der Potenz von 2 zu multiplizieren.
Rechtsverschiebungsoperator mit Vorzeichen (>>)
Da die Linksverschiebung mit 2 multipliziert wird, muss die Rechtsverschiebung durch 2 geteilt werden. Tatsächlich ist dies der Fall, wenn Die Zahl selbst ist eine positive Zahl, 0 wird zum High-Bit hinzugefügt, und wenn es eine negative Zahl ist, wird 1 zum High-Bit hinzugefügt. Beispiel: 3 > Die Kodierung ist 1111 1101. Verschieben Sie sie um 1 Bit nach rechts, um 1111 1110 zu erhalten. Die negative Zahl wird zuerst in eine Dezimalzahl umgewandelt, um 1111 1101 zu erhalten. Invertieren Sie sie in 0000 0010, um -2 zu erhalten.
Die vorzeichenbehaftete Rechtsverschiebung besteht darin, die Dezimalzahl durch die Potenz von 2 zu dividieren und den Rest zu verwerfen.
Vorzeichenloser Rechtsschiebeoperator (>>>)
Das Ergebnis der vorzeichenlosen Rechtsschiebeoperation positiver Zahlen ist das gleiche wie das der vorzeichenbehafteten Rechtsschiebeoperation, hauptsächlich negative Zahlen Das vorzeichenlose Rechtsschaltbetrieb. Der Unterschied zur vorzeichenbehafteten Rechtsverschiebung besteht darin, dass die hohen Bits unabhängig davon, ob es sich um eine positive oder eine negative Zahl handelt, mit 0 ergänzt werden. Bei positiven Zahlen sind die vorzeichenbehafteten und vorzeichenlosen Operationen also gleich, bei negativen Zahlen jedoch eine Welt voller Unterschiede. Beispiel: -1 > 1111 1111 1111 1111 1111 1111 1111, die erste Ziffer ist 0, was eine positive Zahl ist, also 230 229... 20=230(1-1/231)/(1). -1/2)=231-1= 2147483647, auf diese Weise haben wir endlich das Ergebnis erhalten, das wir brauchten. Das Ergebnis ist schrecklich, mit Vorsicht verwenden!
Anwendung bitweiser Operatoren:
Nachdem wir so lange darüber gesprochen haben, besteht das ultimative Ziel darin, diese Operatoren zu verwenden:
Der RGB-Wert von Farbe und die Hexadezimalkonvertierung: Beispiel: Ein Farbwert: #33cc10, die ersten beiden Ziffern stehen für Rot (R), die mittleren beiden Ziffern stehen für Grün (G) und die letzten beiden Ziffern stehen für Blau (B). Binärkodierung als: 0011 0011 1100 1100 0001 0000 (der Farbe zugewiesen). Zuerst müssen wir den Rotwert ermitteln, der um 16 Bit nach rechts verschoben werden muss (Farbe>>16), also 0000 0000 0000 0000 0011 0011. Auf diese Weise erhalten wir R=51. Wenn wir dann den Grünwert erhalten möchten, müssen wir ihn um 8 Bit nach rechts verschieben, Farbe>>8, um 0000 0000 0011 0011 1100 1100 zu erhalten, und dann den ersten ändern Acht Bits auf 0, 0000 0000 0011 0011 1100 1100|0000 0000 0000 0000 1111 1111, wir erhalten 0000 0000 0000 0000 1100 1100, auf diese Weise erhalten wir G=204 und nehmen schließlich den blauen Wert an einfach ändern Die ersten acht Ziffern werden auf 0 gesetzt, Farbe |. 0000 0000 0000 0000 0001 0000, wir erhalten B = 16, #33cc10 konvertiert in RGB-Wert ist (51,204,16). Andererseits ist die Konvertierung von RGB in Hexadezimalzahl genau das Gegenteil: G << 8 |
Bestimmen Sie, ob ein Knoten der übergeordnete Knoten eines anderen Knotens ist: Beispielsweise gibt es zwei Knoten a und b. Die Methode von ie lautet a.contains(b), um zu bestimmen, ob a ein untergeordneter Knoten von b ist, während other Moderne Browser verwenden die Methode a.compareDocumentPosition(b). Dieses Rückgabeergebnis ist kein boolescher Wert. Wenn a und b derselbe Knoten sind, wird 0 zurückgegeben. Wenn sich a und b in unterschiedlichen Dokumenten befinden oder mindestens einer von ihnen ist Außerhalb des Dokuments wird 1 zurückgegeben. Wenn b vor a liegt, wird 2 zurückgegeben. Wenn a vor b liegt, wird 4 zurückgegeben. Wenn b a enthält, wird 8 zurückgegeben. Wenn a b enthält, wird 16 zurückgegeben, und 32 ist exklusiv für den Browser. Die Binärcodes von 0, 1, 2, 4, 8 und 16 lauten jeweils 0000 0000, 0000 0001, 0000 0010, 0000 0100, 0000 1000, 0001 0000. Wir können feststellen, ob a.compareDocumentPosition(b) & 16 konvertiert wird in boolean konvertieren. Da a.compareDocumentPosition(b) 20 (4 16) zurückgeben sollte, können Sie für die Operation a.compareDocumentPosition(b) == 20 verwenden. Der Vorteil der Verwendung des &-Operators besteht darin, dass wir diese nicht berücksichtigen müssen, sondern nur Muss berücksichtigt werden. Kann die &-Operation mit dem Wert 16, den wir benötigen, true zurückgeben? (John Resig verfügt über eine Methode zur Simulation von CompareDocumentPosition, sodass diese auch unter IE anwendbar ist. Wenn Sie interessiert sind, können Sie auf den Link am Ende des Artikels verweisen ~)
Bitweise Linksverschiebungsoperation: Wir Wenn Sie wissen, dass die bitweise Linksverschiebung um 1 Bit mit 2 multiplizieren ist, können wir a<<1 anstelle von a*2 verwenden, da die Effizienz von Bitoperationen schneller ist als bei gewöhnlichen Operationen (manchmal erhalten Sie möglicherweise das gegenteilige Ergebnis, die Geschwindigkeit). Die Anzahl der Bitoperationen in JavaScript ist sehr schlecht, im Vergleich zu C# liegt sie zu weit zurück~).
Bitweise Rechtsverschiebung: Einerseits können Sie a>>1 verwenden, um a/2 zu ersetzen. Darüber hinaus können Sie durch bitweise Rechtsverschiebung Dezimalzahlen problemlos in ganze Zahlen umwandeln, z. B. 3,1415>>0 =3, Da für die bitweise Verschiebungsoperation erforderlich ist, dass der Operand eine Ganzzahl ist (Einzelheiten finden Sie im ECMA-262-Handbuch), werden die Dezimalstellen nach der Operation verworfen~
Hinweis: Bitweise Operatoren erfordern dies Ihre numerischen Operanden sind Ganzzahlen, und diese Operanden werden durch 32-Bit-Ganzzahlen dargestellt, und das 32. Bit ist das Vorzeichenbit. Darüber hinaus sind die Operanden auf den 32-Bit-Ganzzahlbereich beschränkt und der rechte Operand muss zwischen 0 und 31 liegen. (Die Binärkodierung in diesem Artikel ist nicht standardisiert und dient nur der Bequemlichkeit~)