Gli operatori bit a bit sono comodi da usare e possono generare un codice velocissimo. Scopri cosa sono e come usarli.

Gli operatori bit per bit sono quelli che agiscono a livello binario. Spesso sono molto veloci da eseguire e in genere agiscono su due operandi.

È possibile utilizzare operatori bit per bit per manipolare numeri binari, ottimizzare il codice, comprimere i dati e implementare tecniche per la grafica o la programmazione di giochi. Come la maggior parte degli altri linguaggi di programmazione, JavaScript ha un eccellente supporto per le operazioni bit a bit.

Cosa sono gli operatori?

La maggior parte dei linguaggi di programmazione utilizza il concetto di "operatore", un simbolo che indica all'interprete di eseguire una specifica operazione matematica, relazionale o logica.

Ci sono molti diversi tipi di operatore JavaScript dovresti essere a conoscenza, da quelli che sembrano operatori matematici standard, come "+", agli operatori che confrontano due valori. Gli operatori bit a bit sono un set speciale che si occupa di numeri binari.

instagram viewer

Operatore AND (&) bit a bit

JavaScript AND bit a bit (&) confronta i bit corrispondenti di due operandi binari: numeri che contengono solo 0 e 1. Per ogni coppia di bit di ingresso, il bit di uscita corrispondente è "1" se entrambi i bit di ingresso sono "1" o "0" altrimenti.

Ecco la sintassi dell'operatore AND bit a bit:

a & b

In questo esempio, UN E B sono gli operandi su cui si sta eseguendo l'operazione bit a bit.

Ecco come funziona l'operatore AND bit a bit:

  1. L'operazione AND si applica a ciascuna coppia di bit corrispondenti in UN E B da destra a sinistra.
  2. Se entrambi i bit sono 1, il risultato è 1. Se uno dei bit è 0, il risultato è 0.
  3. Il risultato è un nuovo numero in cui ogni bit rappresenta il risultato dell'operazione AND sui bit corrispondenti di UN E B.

Per esempio:

permettere un = 50; // 00110010
permettere b = 100; // 01100100

permettere risultato = a & b; // 00100000

consolare.log (risultato); // 32

Nell'esempio sopra, UN è 50 in decimale, equivalente al numero binario 00110010, e B è 100 in decimale, equivalente al numero binario 01100100. L'operatore AND confronta ciascuna coppia di bit corrispondenti da destra a sinistra e produce il numero binario risultante 00100000, che è 32 in decimale.

Operatore OR bit a bit (|).

L'OR bit a bit (|) confronta i bit corrispondenti di due operandi e restituisce "1" se uno o entrambi i bit sono "1" e "0" se entrambi i bit sono "0".

Ecco la sintassi dell'operatore OR bit a bit:

un | B

Dove UN E B sono gli operandi dell'operazione.

L'operatore OR bit per bit (|) funziona allo stesso modo dell'operatore AND bit per bit. L'unica differenza è che l'operatore OR restituisce "1" se "uno" dei bit è "1" e "0" se "entrambi" i bit sono "0".

Per esempio:

permettere un = 50; // 00110010
permettere b = 100; // 01100100

permettere risultato = a | B; // 01110110

consolare.log (risultato); // 118

Nell'esempio precedente, l'operatore OR bit per bit confronta ciascuna coppia di bit da destra a sinistra (ovvero, 0 | 0 = 0, 0 | 1 = 1, 1 | 1 = 1, e così via). Il numero binario risultante è 01110110, che è 118 in decimale.

Operatore XOR bit a bit (^).

L'XOR bit a bit (^) confronta i bit corrispondenti di due operandi e restituisce "1" se uno degli operandi, ma non entrambi, è "1" e "0" se entrambi gli operandi sono "1" o "0".

Ecco la sintassi dell'operatore XOR bit a bit:

un ^ b

Dove UN E B sono gli operandi dell'operazione.

L'operatore XOR bit per bit funziona allo stesso modo degli operatori OR bit per bit e AND. L'unica differenza è che restituisce "1" se "uno ma non entrambi" degli operandi è "1" e "0" se "entrambi" degli operandi sono "1" o "0".

Per esempio:

permettere un = 50; // 00110010
permettere b = 100; // 01100100

permettere risultato = a ^ b; // 01010110

consolare.log (risultato); // 86

Nell'esempio precedente, l'operatore XOR confronta ciascuna coppia di bit da destra a sinistra (ovvero, 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 1 = 0, e così via). Il numero binario risultante è 01010110, che è 86 in decimale.

Operatore NOT (~) bit a bit

Il NOT bit a bit (~) è un operatore unario che opera su un singolo numero intero invertendo tutti i suoi bit. In altre parole, cambia ogni bit "0" in "1" e ogni bit "1" in "0".

Ecco la sintassi dell'operatore NOT bit a bit:

~ c

Dove C è l'operando.

L'operatore NOT bit per bit funziona invertendo tutti i bit di un operando, inclusi i bit di segno.

Per esempio:

permettere c = 10; // 00001010
permettere d = -10; // 11110110

consolare.log(~c); // 11110101
consolare.log(~d); // 00001001

Nell'esempio precedente, l'operatore NOT inverte tutti i bit (ovvero, 01, 10, ecc.), compresi i bit di segno.

Operatore Shift sinistro (<

L'operatore di spostamento a sinistra sposta i bit di un dato numero a sinistra. L'operatore accetta due operandi: il numero da spostare e il numero di bit di cui spostarlo.

Ecco la sintassi per l'operatore di spostamento a sinistra:

a << b

Dove UN è l'operando per l'operatore di spostamento a sinistra, e B è il numero di bit di cui l'operatore sposterà l'operando.

L'operatore di spostamento a sinistra funziona spostando ogni bit di un operando a sinistra del numero specificato di posizioni e scartando i bit in eccesso spostati a sinistra.

Per esempio:

permettere un = 50; // 00110010
permettere b = 2;

permettere risultato = a << b; // 11001000

consolare.log (risultato); // 200

Nell'esempio precedente, l'operatore di spostamento a sinistra ha spostato di due posizioni il decimale 50 del binario 00110010. Il valore binario risultante è 11001000, che è 200 come decimale.

Operatore Right Shift (>>) di propagazione del segno

Lo spostamento a destra che propaga il segno (>>) sposta a destra i bit di un numero conservando il segno del numero originale. L'operatore accetta due operandi: il numero da spostare e il numero di bit di cui spostarlo.

Ecco la sintassi per l'operatore di spostamento a destra che propaga il segno:

un >> b

Dove UN è l'operando per l'operatore di spostamento a destra, e B è il numero di bit di cui l'operatore sposterà l'operando.

L'operatore di spostamento a destra che propaga il segno funziona in modo simile all'operatore di spostamento a sinistra; l'unica differenza nella modalità di funzionamento è che lo spostamento a destra mantiene il segno.

Per esempio:

permettere un = -50; // 11001110
permettere b = 2;

permettere risultato = a >> b; // 11110011

consolare.log (risultato); // -13

Nell'esempio precedente, l'operatore di spostamento a destra ha spostato il decimale -50 (11001110) di due spazi a destra, ottenendo il decimale -13 (11110011).

Operatore Right Shift (>>>) senza segno

Lo spostamento a destra senza segno (>>>) sposta i bit di un numero a destra di un numero specificato di posizioni e riempie gli spazi vuoti a sinistra con zeri. L'operatore scarta i bit in eccesso che sposta a destra.

Ecco la sintassi per l'operatore di spostamento a destra senza segno:

a >>> b

Dove UN è l'operando per l'operatore di spostamento a destra, e B è il numero di bit di cui l'operatore sposterà l'operando.

L'operatore di spostamento a destra senza segno funziona in modo simile allo spostamento a destra. Tuttavia, a differenza dell'operatore di spostamento a destra (>>), non conserva il segno di un numero durante lo spostamento. Al contrario, tratta il numero come un numero intero senza segno e riempie il bit più a sinistra con uno zero.

Per esempio:

permettere un = -5; // 11111111 11111111 11111111 11111011
permettere b = 2;

permettere risultato = a >>> b; // 00111111 11111111 11111111 11111110

consolare.log (risultato); // 1073741822

In questo esempio, l'operatore di spostamento a destra senza segno ha spostato "-5" di due spazi a destra, rimuovendo di fatto il segno e risultando nel decimale "1073741822".

Le applicazioni degli operatori bit a bit

Manipolando singoli bit in numeri binari, gli operatori bit a bit possono creare funzionalità complesse altrimenti difficili o impossibili da ottenere con le operazioni aritmetiche tradizionali.

Comprendere come utilizzare gli operatori bit per bit può aiutarti a creare applicazioni Web più efficienti e performanti.