Operações bit a bit JavaScript
Operadores Bitwise JavaScript
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 |
Exemplos
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 usa operandos bit a bit de 32 bits
JavaScript armazena números como números de ponto flutuante de 64 bits, mas todas as operações bit a bit são executadas em números binários de 32 bits.
Antes que uma operação bit a bit seja executada, o JavaScript converte números em inteiros com sinal de 32 bits.
Depois que a operação bit a bit é executada, o resultado é convertido novamente em números JavaScript de 64 bits.
Os exemplos acima usam números binários sem sinal de 4 bits. Por causa disso ~ 5 retorna 10.
Como o JavaScript usa inteiros assinados de 32 bits, ele não retornará 10. Ele retornará -6.
00000000000000000000000000000101 (5)
1111111111111111111111111111010 (~5 = -6)
Um inteiro com sinal usa o bit mais à esquerda como sinal de menos.
E bit a bit
Quando um AND bit a bit é executado em um par de bits, ele retorna 1 se ambos os bits forem 1.
Operação | Resultado |
---|---|
0 e 0 | 0 |
0 e 1 | 0 |
1 e 0 | 0 |
1 e 1 | 1 |
Operação | Resultado |
---|---|
1111 e 0000 | 0000 |
1111 e 0001 | 0001 |
1111 e 0010 | 0010 |
1111 e 0100 | 0100 |
OU bit a bit
Quando um OR bit a bit é executado em um par de bits, ele retorna 1 se um dos bits for 1:
Operação | Resultado |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Operação | Resultado |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
XOR bit a bit
Quando um XOR bit a bit é executado em um par de bits, ele retorna 1 se os bits forem diferentes:
Operação | Resultado |
---|---|
0^0 | 0 |
0^1 | 1 |
1^0 | 1 |
1^1 | 0 |
Operação | Resultado |
---|---|
1111 ^ 0000 | 1111 |
1111^0001 | 1110 |
1111^0010 | 1101 |
1111^0100 | 1011 |
JavaScript bit a bit AND (&)
Bitwise AND retorna 1 somente se ambos os bits forem 1:
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 e 1 | 00000000000000000000000000000001 (1) |
Exemplo
let x = 5 & 1;
JavaScript bit a bit OU (|)
O OR bit a bit retorna 1 se um dos bits for 1:
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Exemplo
let x = 5 | 1;
XOR bit a bit JavaScript (^)
Bitwise XOR retorna 1 se os bits forem diferentes:
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5^1 | 00000000000000000000000000000100 (4) |
Exemplo
let x = 5 ^ 1;
JavaScript bit a bit NÃO (~)
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
~5 | 1111111111111111111111111111010 (-6) |
Exemplo
let x = ~5;
JavaScript (preenchimento zero) Deslocamento à esquerda bit a bit (<<)
Este é um deslocamento à esquerda de preenchimento zero. Um ou mais bits zero são inseridos da direita e os bits mais à esquerda caem:
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
Exemplo
let x = 5 << 1;
JavaScript (preservação de sinal) Deslocamento à direita bit a bit (>>)
Este é um sinal que preserva o deslocamento à direita. As cópias do bit mais à esquerda são empurradas da esquerda e os bits mais à direita caem:
Decimal | Binário |
---|---|
-5 | 1111111111111111111111111111011 |
-5 >> 1 | 1111111111111111111111111111101 (-3) |
Exemplo
let x = -5 >> 1;
Deslocamento direito JavaScript (preenchimento zero) (>>>)
Este é um deslocamento à direita de preenchimento zero. Um ou mais bits zero são inseridos da esquerda e os bits mais à direita caem:
Decimal | Binário |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
Exemplo
let x = 5 >>> 1;
Números binários
Números binários com apenas um conjunto de bits são fáceis de entender:
Representação Binária | Valor decimal |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Definir mais alguns bits revela o padrão binário:
Representação Binária | Valor decimal |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000001101 | 13 (8 + 4 + 1) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Os números binários do JavaScript são armazenados no formato de complemento de dois.
Isso significa que um número negativo é o NOT bit a bit do número mais 1:
Representação Binária | Valor decimal |
---|---|
00000000000000000000000000000101 | 5 |
1111111111111111111111111111011 | -5 |
00000000000000000000000000000110 | 6 |
1111111111111111111111111111010 | -6 |
00000000000000000000000000101000 | 40 |
1111111111111111111111111011000 | -40 |
Convertendo Decimal para Binário
Exemplo
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Convertendo Binário para Decimal
Exemplo
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}