Suche…
Bitweise Operatoren
Bitweise Operatoren führen Operationen mit Bitwerten von Daten durch. Diese Operatoren konvertieren Operanden in Zweierkomplement in vorzeichenbehaftete 32-Bit-Ganzzahlen.
Konvertierung in 32-Bit-Ganzzahlen
Zahlen mit mehr als 32 Bits verwerfen ihre höchstwertigen Bits. Beispielsweise wird die folgende Ganzzahl mit mehr als 32 Bit in eine 32-Bit-Ganzzahl konvertiert:
Before: 10100110111110100000000010000011110001000001
After: 10100000000010000011110001000001
Zwei-Komplement
Im normalen binären finden wir den binären Wert durch Addition des 1
s‘auf der Grundlage ihrer Position als Potenzen von 2 - Das Bit ganz rechts ist 2^0
auf den äußersten linken Bit ist 2^n-1
wobei n
die Anzahl der Bits ist. Zum Beispiel mit 4 Bits:
// Normal Binary
// 8 4 2 1
0 1 1 0 => 0 + 4 + 2 + 0 => 6
Das Zwei-Komplement-Format bedeutet, dass das negative Gegenstück der Zahl (6 gegenüber -6) alle Bits für eine invertierte Zahl plus eins ist. Die invertierten Bits von 6 wären:
// Normal binary
0 1 1 0
// One's complement (all bits inverted)
1 0 0 1 => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
1 0 1 0 => -8 + 0 + 2 + 0 => -6
Hinweis: mehr Hinzufügen von 1
‚s links von einer Binärzahl seinen Wert nicht in Kompliment der beiden ändern. Der Wert 1010
und 1111111111010
sind beide -6
.
Bitweises AND
Das bitweise UND - Operation a & b
gibt den Binärwert mit einem 1
in den beiden binären Operanden 1
‚s in einer bestimmten Position, und 0
in allen anderen Positionen. Zum Beispiel:
13 & 7 => 5
// 13: 0..01101
// 7: 0..00111
//-----------------
// 5: 0..00101 (0 + 0 + 4 + 0 + 1)
Beispiel aus der realen Welt: Paritätsprüfung der Zahl
Anstelle dieses "Meisterstücks" (leider zu oft in vielen echten Codeteilen zu sehen):
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
if (isEven(n)) {
return false;
} else {
return true;
}
}
Sie können die Parität der (ganzzahligen) Zahl auf viel effektivere und einfachere Weise überprüfen:
if(n & 1) {
console.log("ODD!");
} else {
console.log("EVEN!");
}
Bitweises ODER
Die bitweise ODER-Verknüpfung a | b
gibt den binären Wert mit einer 1
wobei entweder Operanden oder beide Operanden 1
an einer bestimmten Position haben und 0
wenn beide Werte 0
an einer Position haben. Zum Beispiel:
13 | 7 => 15
// 13: 0..01101
// 7: 0..00111
//-----------------
// 15: 0..01111 (0 + 8 + 4 + 2 + 1)
Bitweises NICHT
Die bitweise NOT-Operation ~a
dreht die Bits des angegebenen Werts a
. Dies bedeutet, dass alle 1
zu 0
und alle 0
zu 1
.
~13 => -14
// 13: 0..01101
//-----------------
//-14: 1..10010 (-16 + 0 + 0 + 2 + 0)
Bitweises XOR
Die bitweise XOR-Operation ( exklusiv oder ) a ^ b
setzt nur dann eine 1
, wenn die beiden Bits unterschiedlich sind. Exklusiv oder bedeutet entweder das eine oder das andere, aber nicht beides .
13 ^ 7 => 10
// 13: 0..01101
// 7: 0..00111
//-----------------
// 10: 0..01010 (0 + 8 + 0 + 2 + 0)
Beispiel aus der Praxis: Vertauschen von zwei ganzzahligen Werten ohne zusätzliche Speicherzuordnung
var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11
Schichtoperatoren
Eine bitweise Verschiebung kann als "Verschieben" der Bits nach links oder rechts betrachtet werden, wodurch der Wert der bearbeiteten Daten geändert wird.
Linksverschiebung
Der linke Verschiebungsoperator (value) << (shift amount)
verschiebt die Bits um (shift amount)
Bits nach links; Die neuen Bits, die von rechts hereinkommen, werden 0
:
5 << 2 => 20
// 5: 0..000101
// 20: 0..010100 <= adds two 0's to the right
Rechte Verschiebung ( Vorzeichenverbreitung )
Der Rechtsverschiebungsoperator (value) >> (shift amount)
wird auch als "Zeichenverschiebung nach rechts" bezeichnet, da er das Vorzeichen des ursprünglichen Operanden beibehält. Der Rechtsverschiebungsoperator verschiebt den value
die angegebene shift amount
von Bits nach rechts. Überschüssige Bits, die nach rechts verschoben wurden, werden verworfen. Die neuen von links kommenden Bits basieren auf dem Vorzeichen des ursprünglichen Operanden. Wenn das am weitesten links stehende Bit 1
war, sind die neuen Bits alle 1
und umgekehrt für 0
.
20 >> 2 => 5
// 20: 0..010100
// 5: 0..000101 <= added two 0's from the left and chopped off 00 from the right
-5 >> 3 => -1
// -5: 1..111011
// -2: 1..111111 <= added three 1's from the left and chopped off 011 from the right
Right Shift ( Nullfüllung )
Der Verschiebungsoperator für die Nullfüllung rechts (value) >>> (shift amount)
verschiebt die Bits nach rechts und die neuen Bits werden 0
. Die 0
‚s werden von links verschoben, und überschüssige Bits nach rechts verschoben aus und verworfen. Dies bedeutet, dass aus negativen Zahlen positive Werte werden können.
-30 >>> 2 => 1073741816
// -30: 111..1100010
//1073741816: 001..1111000
Die Verschiebung nach rechts mit Nullen und die Verschiebung mit Vorzeichen nach rechts führt zu nicht negativen Zahlen.