JavaScript Operatori bit a bit


Esempio

Gli operatori bit a bit eseguono operazioni sui valori bit dei dati. Questi operatori convertono gli operandi in interi a 32 bit con segno nel complemento a due .

Conversione in numeri interi a 32 bit

I numeri con più di 32 bit scartano i loro bit più significativi. Ad esempio, il seguente intero con più di 32 bit viene convertito in un numero intero a 32 bit:

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

Complemento di due

Nel binario normale troviamo il valore binario aggiungendo gli 1 base alla loro posizione come potenze di 2 - Il bit più a destra è 2^0 al bit più a sinistra essendo 2^n-1 dove n è il numero di bit. Ad esempio, utilizzando 4 bit:

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

Il formato di due complementi significa che la controparte negativa del numero (6 vs -6) è costituita da tutti i bit per un numero invertito, più uno. I bit invertiti di 6 sarebbero:

// 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

Nota: l' aggiunta di più 1 alla sinistra di un numero binario non cambia il suo valore nel complimento di due. I valori 1010 e 1111111111010 sono entrambi -6 .

Bitwise AND

L'operazione AND bit a bit a & b restituisce il valore binario con un 1 cui entrambi gli operandi binari hanno 1 's in una posizione specifica e 0 in tutte le altre posizioni. Per esempio:

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

Esempio di mondo reale: controllo di parità del numero

Invece di questo "capolavoro" (purtroppo troppo spesso visto in molte parti di codice reali):

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

Puoi controllare la parità del numero (intero) in modo molto più efficace e semplice:

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

Bitwise OR

L'operazione OR bit a bit a | b restituisce il valore binario con un 1 dove entrambi gli operandi o entrambi gli operandi hanno 1 's in una posizione specifica e 0 quando entrambi i valori hanno 0 in una posizione. Per esempio:

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

Bitwise NOT

L'operazione NOT bit a bit ~a ribalta i bit del valore dato a . Ciò significa che tutti gli 1 diventeranno 0 e tutti gli 0 diventeranno 1 .

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

XOR bit a bit

L'operazione di bit XOR ( esclusiva o ) a ^ b pone un 1 solo se i due bit sono diversi. Esclusivo o significa l'uno o l'altro, ma non entrambi .

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

Esempio di mondo reale: scambio di due valori interi senza allocazione di memoria aggiuntiva

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