JavaScript operazioni bit a bit
JavaScript operatori bit a bit
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
Esempi
Operation | Result | Same as | Result |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
JavaScript utilizza operandi bit a bit a 32 bit
JavaScript memorizza i numeri come numeri in virgola mobile a 64 bit, ma tutte le operazioni bit per bit vengono eseguite su numeri binari a 32 bit.
Prima che venga eseguita un'operazione bit per bit, JavaScript converte i numeri in interi con segno a 32 bit.
Dopo aver eseguito l'operazione bit per bit, il risultato viene riconvertito in numeri JavaScript a 64 bit.
Gli esempi precedenti utilizzano numeri binari senza segno a 4 bit. Per questo motivo ~ 5 restituisce 10.
Poiché JavaScript utilizza numeri interi con segno a 32 bit, non restituirà 10. Restituirà -6.
000000000000000000000000000000101 (5)
111111111111111111111111111111111111010 (~5 = -6)
Un intero con segno utilizza il bit più a sinistra come segno meno.
bit a bit E
Quando un AND bit per bit viene eseguito su una coppia di bit, restituisce 1 se entrambi i bit sono 1.
Operazione | Risultato |
---|---|
0 e 0 | 0 |
0 e 1 | 0 |
1 e 0 | 0 |
1 e 1 | 1 |
Operazione | Risultato |
---|---|
1111 e 0000 | 0000 |
1111 e 0001 | 0001 |
1111 e 0010 | 0010 |
1111 e 0100 | 0100 |
OR bit a bit
Quando viene eseguito un OR bit per bit su una coppia di bit, restituisce 1 se uno dei bit è 1:
Operazione | Risultato |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Operazione | Risultato |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
XOR bit a bit
Quando viene eseguito un XOR bit per bit su una coppia di bit, restituisce 1 se i bit sono diversi:
Operazione | Risultato |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1^ 0 | 1 |
1^1 | 0 |
Operazione | Risultato |
---|---|
1111 ^ 0000 | 1111 |
1111^ 0001 | 1110 |
1111^ 0010 | 1101 |
1111^ 0100 | 1011 |
JavaScript bit a bit AND (&)
Bit per bit AND restituisce 1 solo se entrambi i bit sono 1:
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 e 1 | 000000000000000000000000000000001 (1) |
Esempio
let x = 5 & 1;
JavaScript bit a bit O (|)
Bitwise OR restituisce 1 se uno dei bit è 1:
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 | 1 | 000000000000000000000000000000101 (5) |
Esempio
let x = 5 | 1;
JavaScript bit per bit XOR (^)
Bitwise XOR restituisce 1 se i bit sono diversi:
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5^1 | 000000000000000000000000000000100 (4) |
Esempio
let x = 5 ^ 1;
JavaScript bit a bit NON (~)
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
~5 | 111111111111111111111111111111111111010 (-6) |
Esempio
let x = ~5;
JavaScript (riempimento zero) Maiusc sinistro bit per bit (<<)
Questo è uno spostamento a sinistra di riempimento zero. Uno o più bit zero vengono inseriti da destra e i bit più a sinistra cadono:
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
5 << 1 | 000000000000000000000000000001010 (10) |
Esempio
let x = 5 << 1;
JavaScript (mantenimento del segno) Maiusc a destra bit per bit (>>)
Questo è un segno che preserva il cambio a destra. Le copie del bit più a sinistra vengono inserite da sinistra e i bit più a destra cadono:
Decimale | Binario |
---|---|
-5 | 11111111111111111111111111111111111011 |
-5 >> 1 | 111111111111111111111111111111111111101 (-3) |
Esempio
let x = -5 >> 1;
JavaScript (riempimento zero) Maiusc a destra (>>>)
Questo è uno spostamento a destra di riempimento zero. Uno o più bit zero vengono inseriti da sinistra e i bit più a destra cadono:
Decimale | Binario |
---|---|
5 | 000000000000000000000000000000101 |
5 >>> 1 | 000000000000000000000000000000010 (2) |
Esempio
let x = 5 >>> 1;
Numeri binari
I numeri binari con un solo bit impostato sono facili da capire:
Rappresentazione binaria | Valore decimale |
---|---|
000000000000000000000000000000001 | 1 |
000000000000000000000000000000010 | 2 |
000000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
000000000000000000000000000010000 | 16 |
000000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
L'impostazione di alcuni bit in più rivela il modello binario:
Rappresentazione binaria | Valore decimale |
---|---|
000000000000000000000000000000101 | 5 (4 + 1) |
000000000000000000000000000001101 | 13 (8 + 4 + 1) |
000000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
I numeri binari JavaScript sono memorizzati nel formato in complemento a due.
Ciò significa che un numero negativo è il NOT bit per bit del numero più 1:
Rappresentazione binaria | Valore decimale |
---|---|
000000000000000000000000000000101 | 5 |
11111111111111111111111111111111111011 | -5 |
00000000000000000000000000000110 | 6 |
11111111111111111111111111111111111010 | -6 |
000000000000000000000000000101000 | 40 |
11111111111111111111111111111111011000 | -40 |
Conversione da decimale a binario
Esempio
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Conversione da binario a decimale
Esempio
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}