Os operadores bit a bit permitem manipular dados diretamente no nível dos bits.
📖 O que você vai aprender nesta página
✅ Essenciais que você precisa saber
& (AND), | (OR), ^ (XOR), ~ (NOT)
<< (shift à esquerda) multiplica por 2, >> (shift à direita) divide por 2
⭐ Leia se tiver tempo
Gerenciar flags de on/off
Usar máscaras de bits para extrair bits específicos
Shift à direita com sinal é definido pela implementação
O que são operadores bit a bit?
Computadores representam todos os dados internamente como binário (sequências de bits). Os operadores bit a bit permitem manipular diretamente cada bit dessa representação.
Lógicos
& | ^ ~
Shift
<< >>
Para que servem? Gerenciamento de flags, mascaramento, multiplicação e divisão rápidas, controle de hardware, criptografia e mais. São essenciais em programação embarcada e de sistemas.
Pré-requisito: O decimal 12 é 00001100 em binário. Cada dígito (0 ou 1) é um bit do valor.
AND, OR, XOR, NOT
Esses operadores aplicam uma operação lógica a cada bit de forma independente.
AND ( & )
A
B
A&B
0
0
0
0
1
0
1
0
0
1
1
1
1 somente quando os dois bits são 1
OR ( | )
A
B
A|B
0
0
0
0
1
1
1
0
1
1
1
1
1 se qualquer um dos bits for 1
XOR ( ^ )
A
B
A^B
0
0
0
0
1
1
1
0
1
1
1
0
1 somente quando os bits são diferentes
NOT ( ~ )
A
~A
0
1
1
0
Inverte todos os bits
Exemplo
0b11001010 (= 202)
& 0b10101010 (= 170)
-----------
0b10001010 (= 138) // Só permanecem os bits que estão setados em ambos os operandos
Operações de Shift (<<, >>)
Esses operadores deslocam uma sequência de bits para a esquerda ou para a direita.
Shift à esquerda ( << )
a << n = a × 2n 5 << 1 → 10 (5×2) 5 << 3 → 40 (5×8)
Shift à direita ( >> )
a >> n = a ÷ 2n (truncando) 40 >> 1 → 20 (40÷2) 40 >> 3 → 5 (40÷8)
Shift à esquerda em 1 = multiplicar por 2. Shift à direita em 1 = dividir por 2. Shifts são mais rápidos que multiplicação e divisão, por isso são comuns em código sensível a desempenho.
Casos de Uso
Verificação de par/ímpar
if (n & 1) printf("ímpar\n");
elseprintf("par\n");
// O bit menos significativo é 1 para ímpares e 0 para pares
Gerenciamento de flags
#define FLAG_READ (1 << 0) // 0001 = 1#define FLAG_WRITE (1 << 1) // 0010 = 2#define FLAG_EXEC (1 << 2) // 0100 = 4int perm = 0;
perm |= FLAG_READ; // liga a flag
perm |= FLAG_WRITE; // liga a flagif (perm & FLAG_READ) ... // verifica se a flag está setada
perm &= ~FLAG_WRITE; // desliga a flag
As permissões de arquivo do Linux (rwx para leitura, escrita e execução) são exatamente esse tipo de esquema de bit-flags.
Extraindo bits específicos (mascaramento)
int color = 0xFF5733; // cor RGBint r = (color >> 16) & 0xFF; // 255int g = (color >> 8) & 0xFF; // 87int b = color & 0xFF; // 51
Calculadora Bit a Bit
Digite dois números para ver o resultado de cada operação bit a bit.
Pressione Calcular para ver os resultados.
Quiz
Qual o resultado de 0b1100 & 0b1010?
0b1000 (8)
0b1110 (14)
0b0110 (6)
0b1010 (10)
Explicação: AND produz 1 só onde ambos os bits são 1. 1100 & 1010 → 1000 (= 8). Apenas o 3º bit da direita está setado nos dois operandos.
Por qual fator n << 3 multiplica n?
x3
x6
x8
x16
Explicação: Shift à esquerda em n posições multiplica por 2n. n << 3 = n × 23 = n × 8.