Os operadores bit a bit são convenientes de usar e podem resultar em um código extremamente rápido. Saiba o que são e como utilizá-los.

Operadores bit a bit são aqueles que atuam em um nível binário. Eles geralmente são muito rápidos de executar e normalmente agem em dois operandos.

Você pode usar operadores bit a bit para manipular números binários, otimizar código, compactar dados e implementar técnicas para gráficos ou programação de jogos. Como a maioria das outras linguagens de programação, o JavaScript tem excelente suporte para operações bit a bit.

O que são operadores?

A maioria das linguagens de programação usa o conceito de "operador" - um símbolo que diz ao interpretador para realizar uma operação matemática, relacional ou lógica específica.

Existem muitos diferentes tipos de operador JavaScript você deve estar ciente, desde aqueles que se parecem com operadores matemáticos padrão, como "+", até operadores que comparam dois valores. Os operadores bit a bit são um conjunto especial que lida com números binários.

Operador AND (&) bit a bit

O JavaScript AND bit a bit (&) compara os bits correspondentes de dois operandos binários—números que contêm apenas 0 e 1. Para cada par de bits de entrada, o bit de saída correspondente é “1” se ambos os bits de entrada forem “1” ou “0” caso contrário.

Aqui está a sintaxe do operador AND bit a bit:

a & b

Neste exemplo, a e b são os operandos nos quais você está executando a operação bit a bit.

Veja como o operador AND bit a bit funciona:

  1. A operação AND se aplica a cada par de bits correspondentes em a e b da direita para esquerda.
  2. Se ambos os bits forem 1, o resultado será 1. Se um dos bits for 0, o resultado será 0.
  3. O resultado é um novo número onde cada bit representa o resultado da operação AND nos bits correspondentes de a e b.

Por exemplo:

deixar um = 50; // 00110010
deixar b = 100; // 01100100

deixar resultado = a & b; // 00100000

console.log (resultado); // 32

No exemplo acima, a é 50 em decimal, equivalente ao número binário 00110010, e b é 100 em decimal, equivalente ao número binário 01100100. O operador AND compara cada par de bits correspondentes da direita para a esquerda e produz o número binário resultante 00100000, que é 32 em decimal.

Operador OR (|) bit a bit

O OR bit a bit (|) compara os bits correspondentes de dois operandos e retorna “1” se um ou ambos os bits forem “1” e “0” se ambos os bits forem “0”.

Aqui está a sintaxe do operador OR bit a bit:

um | b

Onde a e b são os operandos da operação.

O operador OR (|) bit a bit funciona da mesma maneira que o operador AND bit a bit. A única diferença é que o operador OR retorna “1” se “qualquer” dos bits for “1” e “0” se “ambos” os bits forem “0”.

Por exemplo:

deixar um = 50; // 00110010
deixar b = 100; // 01100100

deixar resultado = a | b; // 01110110

console.log (resultado); // 118

No exemplo acima, o operador OR bit a bit compara cada par de bits da direita para a esquerda (ou seja, 0 | 0 = 0, 0 | 1 = 1, 1 | 1 = 1, e assim por diante). O número binário resultante é 01110110, que é 118 em decimal.

Operador XOR (^) bit a bit

O bit a bit XOR (^) compara os bits correspondentes de dois operandos e retorna “1” se um dos operandos, mas não ambos, for “1” e “0” se ambos os operandos forem “1” ou “0”.

Aqui está a sintaxe do operador XOR bit a bit:

a ^ b

Onde a e b são os operandos da operação.

O operador XOR bit a bit funciona da mesma forma que os operadores OR e AND bit a bit. A única diferença é que retorna “1” se “um, mas não ambos” dos operandos for “1” e “0” se “ambos” dos operandos for “1” ou “0”.

Por exemplo:

deixar um = 50; // 00110010
deixar b = 100; // 01100100

deixar resultado = a ^ b; // 01010110

console.log (resultado); // 86

No exemplo acima, o operador XOR compara cada par de bits da direita para a esquerda (ou seja, 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 1 = 0, e assim por diante). O número binário resultante é 01010110, que é 86 em decimal.

Operador NOT (~) bit a bit

O bit a bit NOT (~) é um operador unário que opera em um único inteiro invertendo todos os seus bits. Em outras palavras, ele muda cada bit “0” para “1” e cada bit “1” para “0”.

Aqui está a sintaxe do operador NOT bit a bit:

~c

Onde c é o operando.

O operador NOT bit a bit funciona invertendo todos os bits de um operando, incluindo os bits de sinal.

Por exemplo:

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

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

No exemplo acima, o operador NOT inverte todos os bits (ou seja, 01, 10, etc.), incluindo os bits de sinal.

Operador Shift à Esquerda (<

O operador shift esquerdo desloca os bits de um determinado número para a esquerda. O operador recebe dois operandos: o número a ser deslocado e o número de bits a serem deslocados.

Aqui está a sintaxe para o operador shift esquerdo:

a << b

Onde a é o operando para o operador shift esquerdo, e b é o número de bits que o operador deslocará o operando.

O operador de deslocamento à esquerda funciona deslocando cada bit de um operando para a esquerda pelo número especificado de posições e descartando os bits em excesso deslocados para a esquerda.

Por exemplo:

deixar um = 50; // 00110010
deixar b = 2;

deixar resultado = a << b; // 11001000

console.log (resultado); // 200

No exemplo acima, o operador shift esquerdo deslocou o decimal 50 do binário 00110010 em duas casas. O valor binário resultante é 11001000, que é 200 como um decimal.

Operador Deslocamento à Direita (>>) de Propagação de Sinal

O deslocamento à direita de propagação de sinal (>>) desloca os bits de um número para a direita enquanto preserva o sinal do número original. O operador recebe dois operandos: o número a ser deslocado e o número de bits a serem deslocados.

Aqui está a sintaxe para o operador de deslocamento à direita de propagação de sinal:

a >> b

Onde a é o operando para o operador de deslocamento à direita e b é o número de bits que o operador deslocará o operando.

O operador de deslocamento à direita de propagação de sinal funciona de maneira semelhante ao operador de deslocamento à esquerda; a única diferença no modo de operação é que o turno à direita mantém o sinal.

Por exemplo:

deixar um = -50; // 11001110
deixar b = 2;

deixar resultado = a >> b; // 11110011

console.log (resultado); // -13

No exemplo acima, o operador de deslocamento à direita deslocou o decimal -50 (11001110) dois espaços para a direita, resultando no decimal -13 (11110011).

Operador Deslocamento à direita (>>>) sem sinal

O deslocamento à direita sem sinal (>>>) desloca os bits de um número para a direita por um número especificado de posições e preenche os espaços vazios à esquerda com zeros. O operador descarta os bits em excesso que desloca para a direita.

Aqui está a sintaxe para o operador de deslocamento à direita sem sinal:

a >>> b

Onde a é o operando para o operador de deslocamento à direita e b é o número de bits que o operador deslocará o operando.

O operador de deslocamento à direita sem sinal funciona de maneira semelhante ao deslocamento à direita. No entanto, ao contrário do operador de deslocamento à direita (>>), não preserva o sinal de um número ao deslocar. Em vez disso, trata o número como um inteiro sem sinal e preenche o bit mais à esquerda com um zero.

Por exemplo:

deixar um = -5; // 11111111 11111111 11111111 11111011
deixar b = 2;

deixar resultado = a >>> b; // 00111111 11111111 11111111 11111110

console.log (resultado); // 1073741822

Neste exemplo, o operador de deslocamento à direita sem sinal deslocou “-5” dois espaços para a direita, removendo efetivamente o sinal e resultando no decimal “1073741822”.

As aplicações dos operadores bit a bit

Ao manipular bits individuais em números binários, os operadores bit a bit podem criar funcionalidades complexas que, de outra forma, seriam difíceis ou impossíveis de obter com operações aritméticas tradicionais.

Entender como usar operadores bit a bit pode ajudá-lo a criar aplicativos da Web mais eficientes e com melhor desempenho.