Publicidade

Operadores Bit a Bit

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 ( & )
ABA&B
000
010
100
111
1 somente quando os dois bits são 1
OR ( | )
ABA|B
000
011
101
111
1 se qualquer um dos bits for 1
XOR ( ^ )
ABA^B
000
011
101
110
1 somente quando os bits são diferentes
NOT ( ~ )
A~A
01
10
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)
// 5 em binário
//   00000101 = 5
// 5 << 2
//   00010100 = 20  (5 x 4)
// 20 >> 1
//   00001010 = 10  (20 / 2)
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");
else        printf("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 = 4

int perm = 0;
perm |= FLAG_READ;              // liga a flag
perm |= FLAG_WRITE;             // liga a flag
if (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 RGB
int r = (color >> 16) & 0xFF;  // 255
int g = (color >> 8)  & 0xFF;  // 87
int 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.
Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook