Operatori bitwise ECMAScript
- Pagina precedente Operatori unari
- Pagina successiva Operatori logici
Gli operatori di bit operano a livello di numeri inferiori (cioè i 32 bit che rappresentano i numeri).
Rivedere gli interi
ECMAScript ha due tipi di interi, ovvero interi con segno (che consentono di utilizzare numeri positivi e negativi) e interi senza segno (che consentono solo di utilizzare numeri positivi).In ECMAScript, tutti i numeri interi literals sono interi con segno, cosa significa questo?
Gli interi con segno utilizzano 31 bit per rappresentare il valore numerico e il bit 32 per rappresentare il segno dell'intero, 0 per i numeri positivi e 1 per i numeri negativi.La gamma di valori è da -2147483648 a 2147483647.
Esistono due modi diversi per memorizzare interi con segno in forma binaria, uno per memorizzare numeri positivi e uno per memorizzare numeri negativi.I numeri positivi sono memorizzati in forma binaria vera, con ogni bit dei 31 primi posizioni che rappresenta il potere di 2, iniziando dal primo bit (bit 0) che rappresenta 20La posizione 2 (bit 1) rappresenta 21I bit non utilizzati vengono riempiti con 0, quindi ignorati. Ad esempio, l'immagine seguente mostra la rappresentazione del numero 18.

La versione binaria di 18 utilizza solo i primi 5 bit, che sono i bit validi di questo numero.Convertendo il numero in una stringa binaria, si possono vedere i bit validi:
var iNum = 18; alert(iNum.toString(2)); // Stampa "10010"
Questo codice stampa solo "10010", non la rappresentazione a 32 bit di 18.Altri numeri non sono importanti perché è sufficiente utilizzare solo i primi 5 bit per determinare questo numero decimale.See l'immagine seguente:

I numeri negativi sono anche memorizzati come codici binari, ma nel formato del complemento a due. I passaggi per calcolare il complemento a due di un numero sono tre:
- Determina la rappresentazione binaria non negativa di un numero (ad esempio, per calcolare il complemento a due di -18, è necessario determinare la rappresentazione binaria di 18)
- Calcola il codice di complemento a due, sostituendo 0 con 1 e 1 con 0
- Aggiungi 1 al codice di complemento a due
Per determinare la rappresentazione binaria di -18, è necessario ottenere prima la rappresentazione binaria di 18, come segue:
0000 0000 0000 0000 0000 0000 0001 0010
Calcola il codice di complemento a due, come segue:
1111 1111 1111 1111 1111 1111 1110 1101
Infine, aggiungi 1 al codice di complemento a due, come segue:
1111 1111 1111 1111 1111 1111 1110 1101 1 --------------------------------------- 1111 1111 1111 1111 1111 1111 1110 1110
Quindi, la rappresentazione binaria di -18 è 1111 1111 1111 1111 1111 1111 1110 1110. Ricorda, quando si gestiscono i numeri interi con segno, gli sviluppatori non possono accedere al bit 31.
Curiosamente, quando si converte un numero intero negativo in una stringa binaria, ECMAScript non lo visualizza come complemento a due, ma con il segno negativo davanti al codice binario di valore assoluto. Ad esempio:
var iNum = -18; alert(iNum.toString(2)); // Output "-10010"
Questo codice produce l'output "-10010", non il codice di complemento a due, per evitare l'accesso al bit 31. Per facilità, ECMAScript gestisce gli interi in modo semplice, in modo che gli sviluppatori non debbano preoccuparsi del loro utilizzo.
D'altra parte, i numeri interi senza segno trattano l'ultimo bit come un altro bit. In questo schema, il 32° bit non rappresenta il segno del numero, ma il valore 231A causa di questo bit aggiuntivo, il rango dei numeri interi senza segno va da 0 a 4294967295. Per i numeri interi inferiori a 2147483647, i numeri interi senza segno sembrano essere identici ai numeri interi con segno, mentre per i numeri interi superiori a 2147483647 è necessario utilizzare il bit 31 (nel caso dei numeri interi con segno, questo bit è sempre 0).
Quando si converte un numero intero senza segno in una stringa, viene restituito solo i bit validi.
Attenzione:Tutti i numeri interi literal sono memorizzati come numeri interi con segno per default. Solo gli operatori bitwise di ECMAScript possono creare numeri interi senza segno.
Operazione bitwise NOT
L'operazione di bitwise NOT è rappresentata dal simbolo di negazione (~), ed è uno degli operatori binari meno comuni in ECMAScript.
L'operazione di bit NOT è un processo di tre passaggi:
- Convertire l'operando in un numero di 32 bit
- Convertire un numero binario nel suo codice complementare a due
- Convertire un numero binario in un numero a virgola mobile
Ad esempio:
var iNum1 = 25; // 25 è uguale a 00000000000000000000000000011001 var iNum2 = ~iNum1; // Convertito in 11111111111111111111111111100110 alert(iNum2); // Output: "-26"
L'operazione di bit NOT è sostanzialmente ottenere il negativo del numero e poi sottrarre 1, quindi 25 diventa -26. Puoi ottenere lo stesso risultato con il seguente metodo:
var iNum1 = 25; var iNum2 = -iNum1 -1; alert(iNum2); // Output: -26
Operazione di bit AND
L'operazione di bit AND è rappresentata dal simbolo (&) ed esegue direttamente l'operazione sui numeri in forma binaria. Allinea ogni numero di cifre e poi esegui l'operazione AND sulle due cifre alla stessa posizione secondo le seguenti regole:
Bit del primo numero | Bit del secondo numero | Risultato |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
Ad esempio, per eseguire l'operazione AND tra i numeri 25 e 3, il codice è il seguente:
var iResult = 25 & 3; alert(iResult); // Output: "1"
Il risultato dell'operazione AND tra 25 e 3 è 1. Perché? Analizziamo come segue:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- AND = 0000 0000 0000 0000 0000 0000 0000 0001
Si può vedere che in 25 e 3 c'è solo una posizione (posizione 0) che contiene 1, quindi tutte le altre posizioni generano 0, quindi il risultato è 1.
Operazione di bit OR
L'operazione di bit OR è rappresentata dal simbolo (|) ed esegue direttamente l'operazione sui numeri in forma binaria. Durante il calcolo di ogni cifra, l'operatore OR segue le seguenti regole:
Bit del primo numero | Bit del secondo numero | Risultato |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
Ancora un esempio usando l'operatore AND, per eseguire l'operazione OR tra 25 e 3, il codice è il seguente:
var iResult = 25 | 3; alert(iResult); // Output: "27"
Il risultato dell'operazione OR tra 25 e 3 è 27:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 -------------------------------------------- OR = 0000 0000 0000 0000 0000 0000 0001 1011
Si può vedere che nei due numeri ci sono 4 cifre che contengono 1, queste cifre vengono trasmesse al risultato. Il codice binario 11011 è uguale a 27.
Operazione di bitwise XOR
L'operazione di bitwise XOR è rappresentata dal simbolo (^), naturalmente, è anche direttamente eseguita sul formato binario. XOR è diverso da OR, restituisce 1 solo quando c'è un bit che contiene 1. La tabella di verità è la seguente:
Bit del primo numero | Bit del secondo numero | Risultato |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
Per eseguire l'operazione XOR tra 25 e 3, il codice è il seguente:
var iResult = 25 ^ 3; alert(iResult); // output "26"
Il risultato dell'operazione XOR tra 25 e 3 è 26:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- XOR = 0000 0000 0000 0000 0000 0000 0001 1010
Si può vedere che nei due numeri ci sono 4 bit che contengono 1, questi bit vengono trasmessi al risultato. Il codice binario 11010 è uguale a 26.
Operazione di spostamento a sinistra
L'operazione di spostamento a sinistra è rappresentata da due minuscoli di (<<). Sposta tutti i bit di un numero di un numero di bit a sinistra per una quantità specificata. Ad esempio, se si sposta il numero 2 (uguale a binario 10) di 5 posizioni a sinistra, il risultato è 64 (uguale a binario 1000000):
var iOld = 2; // è uguale a binario 10 var iNew = iOld << 5; // è uguale a binario 1000000 decimale 64
Attenzione:Quando si sposta un numero di bit a sinistra, si creano 5 posizioni vuote alla destra del numero. L'operazione di spostamento a sinistra riempie queste posizioni con 0, rendendo il risultato un numero completo di 32 bit.

Attenzione:L'operazione di spostamento a sinistra mantiene il bit di segno del numero. Ad esempio, se si sposta -2 di 5 posizioni a sinistra, si ottiene -64, non 64. “Il segno è ancora memorizzato nel 32° bit?” Sì, ma questo avviene in background ECMAScript e i sviluppatori non possono accedere direttamente al 32° bit. Anche se si visualizza un numero negativo in forma binaria, viene visualizzato con il segno negativo (ad esempio, -2 viene visualizzato come -10).
Spostamento a destra con segno
L'operatore di spostamento a destra con segno è rappresentato da due maggiore di (>>). Sposta tutti i bit di un numero a 32 bit di insieme a destra, mantenendo il segno del numero (positivo o negativo). L'operatore di spostamento a destra con segno è esattamente opposto all'operazione di spostamento a sinistra. Ad esempio, se si sposta 64 di 5 posizioni a destra, diventa 2:
var iOld = 64; // uguale a 1000000 in binario var iNew = iOld >> 5; // uguale a 10 in binario 2, 10 in decimale
Anche in questo caso, ci saranno posizioni vuote dopo il movimento dei bit. Questa volta, le posizioni vuote si trovano sulla sinistra del numero, ma dopo il bit di segno. ECMAScript riempie queste posizioni vuote con il valore del bit di segno, creando un numero completo come mostrato nella figura sottostante:

Shift a destra senza segno
L'operatore di shift a destra senza segno è rappresentato da tre triangoli greater-than (>>>), che sposta tutti i bit di un numero unsigned 32 bit. Per i numeri positivi, il risultato del shift a destra senza segno è lo stesso del shift a destra con segno.
Con un esempio di shift a destra con segno, se si sposta a destra 64 di 5 bit, diventa 2:
var iOld = 64; // uguale a 1000000 in binario var iNew = iOld >>> 5; // uguale a 10 in binario 2, 10 in decimale
Per i numeri negativi, la situazione è diversa.
Il shift a destra senza segno riempie tutte le posizioni vuote con 0. Per i numeri positivi, questo è lo stesso dell'operazione di shift a destra con segno, mentre per i numeri negativi viene trattato come un numero positivo.
Poiché il risultato del shift a destra senza segno è un numero positivo di 32 bit, il shift a destra senza segno di un numero negativo结果是总是一个非常大的数字。Ad esempio, se si sposta a destra -64 di 5 bit, si ottiene 134217726. Come si ottiene questo risultato?
Per farlo, è necessario convertire questo numero in una forma equivalente unsigned (anche se il numero stesso è signed), che può essere ottenuta con il seguente codice:
var iUnsigned64 = -64 >>> 0;
Poi, utilizzando toString() del tipo Number per ottenere la sua rappresentazione bit vera, con base 2:
alert(iUnsigned64.toString(2));
Questo genererà 11111111111111111111111111000000, che è la rappresentazione in complemento a due del numero intero -64, ma è uguale al numero intero unsigned 4294967232.
Per questo motivo, è necessario usare con cautela l'operatore di shift a destra senza segno.
- Pagina precedente Operatori unari
- Pagina successiva Operatori logici