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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow