Para que servem as operações com bits

As operações bit a bit trabalham em cada dígito binário separadamente. AND deixa em 1 só os bits que são 1 nos dois números, OR os que são 1 em pelo menos um, XOR os que são diferentes, NOT inverte todos. São as instruções mais elementares de um processador, e as mais rápidas.

Servem para ler e ligar flags individuais dentro de um inteiro, aplicar máscaras como as de rede, cuidar das permissões de arquivos Unix, de cores codificadas num inteiro, de somas de verificação e de criptografia. Um AND com 0x0F mantém os quatro bits baixos; um OR com 0x80 liga o mais alto.

Deslocar à esquerda n posições multiplica por 2^n; à direita, divide. Com negativos importa a diferença entre o deslocamento lógico, que insere zeros, e o aritmético, que copia o bit de sinal: -16 >> 2 dá -4, enquanto o lógico dá um positivo grande.

Erros comuns

  • Esquecer a largura da palavra: NOT 0 dá 255 em 8 bits, mas 4294967295 em 32.
  • Usar o deslocamento lógico num número com sinal esperando uma divisão: negativos precisam do aritmético.
  • Em JavaScript, usar & e | com números acima de 32 bits: eles são truncados sem aviso. Para 64 bits é preciso BigInt.

Perguntas frequentes

Qual a diferença entre >> e >>>?

Os dois deslocam à direita. >> é aritmético e copia o bit de sinal, então negativos continuam negativos; >>> é lógico e insere zeros, tratando o número como sem sinal.

Para que serve o XOR?

Para trocar ou comparar bits: A XOR B mostra quais bits diferem, A XOR A dá 0 e A XOR B XOR B volta a A. Por isso ele está na base de somas de verificação, paridade e muitas cifras.

Como verifico se um bit está ligado?

Com um AND entre o número e uma máscara que só tem aquele bit em 1: se o resultado não for zero, o bit está ligado. O bit k tem a máscara 1 << k.

Como funciona este cálculo

Cada operação age sobre os bits da mesma posição: AND = 1 se os dois são 1, OR = 1 se pelo menos um é 1, XOR = 1 se são diferentes, NOT inverte. A << n = A · 2^n truncado à largura w; A >>> n = ⌊A / 2^n⌋ sem sinal; A >> n divide mantendo o sinal. Rotacionar à esquerda n é (A << n) OR (A >>> (w − n)). O valor com sinal é o sem sinal menos 2^w quando o bit mais alto é 1.