Em motores de jogos como Unity e Godot, as camadas de colisão são configuradas como máscaras de bits: cada camada ocupa um bit dentro de um inteiro, e decidir se dois objetos podem colidir se resume a uma única operação AND entre suas máscaras. É um exemplo direto de por que operações bit a bit importam além da teoria de sala de aula.
AND, OR, XOR, NOT — as quatro operações básicas
- AND (&) — o bit resultante é 1 apenas se ambos os bits de entrada forem 1. Serve para verificar se uma camada específica está ativa dentro de uma máscara.
- OR (|) — o bit resultante é 1 se pelo menos um dos bits de entrada for 1. Serve para combinar várias camadas ou flags em um único valor.
- XOR (^) — o bit resultante é 1 se os bits de entrada forem diferentes; aplicar XOR duas vezes com o mesmo valor retorna o original.
- NOT (~) — inverte cada bit de um número.
Em que o AND bit a bit difere do lógico
O AND lógico (&& na maioria das linguagens) trabalha com valores booleanos inteiros e retorna true/false, enquanto o AND bit a bit (&) processa cada bit de dois números separadamente e retorna um número. Confundir os dois é uma causa comum de bugs, principalmente porque em algumas linguagens ambos compilam sem erro de tipo.
Por que esta ferramenta anda junto com o conversor de bases
Uma máscara de camadas com valor decimal 42 não diz nada à primeira vista, mas a mesma máscara escrita como 0b101010 mostra na hora quais camadas exatamente estão ativas. Por isso operações bit a bit quase nunca são raciocinadas em decimal, e sim em binário ou hexadecimal — o conversor de bases costuma ser o passo anterior antes de AND/OR/XOR fazerem sentido visual.
Para que serve isso
- Armazenar e verificar de forma eficiente um conjunto de flags booleanas em um único número.
- Entender código de baixo nível que trabalha com protocolos de rede ou formatos binários.
- Otimizar cálculos onde operações bit a bit são mais rápidas que a aritmética normal.
A armadilha da precedência de operadores
Na maioria das linguagens de programação, os operadores bit a bit & e | têm precedência mais baixa que os operadores de comparação — por isso, uma expressão como if (a & b == c) na verdade é avaliada como a & (b == c), e não como o autor geralmente espera. Essa é uma das causas mais comuns de bugs difíceis de detectar ao trabalhar com máscaras de bits, e a forma confiável de evitá-la é sempre colocar operações bit a bit entre parênteses explícitos.