Manipulação de bits em C e C++
Nesta lição, você vai ligar, desligar, inverter e testar bits individuais de um inteiro para guardar vários estados liga/desliga.
Introdução
Cada bit de um inteiro pode guardar um valor verdadeiro ou falso. Assim, um único inteiro sem sinal pode armazenar várias opções liga/desliga independentes, chamadas flags. Essa técnica de máscara de bits (bit mask) é muito comum em programação de sistemas e de sistemas embarcados.
Pontos importantes
- Teste com entradas vazias, com um único elemento, com valores repetidos e já ordenadas.
- Primeiro faça funcionar corretamente, depois otimize.
- Em código real, prefira as funções prontas da biblioteca padrão.
Exemplos de código C e C++
#include <stdio.h>
int main(void) {
unsigned flags = 0;
flags |= 1u << 1;
flags |= 1u << 3;
flags ^= 1u << 1;
printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
flags=8 bit3=1
#include <bitset>
#include <iostream>
int main() {
std::bitset<4> flags;
flags.set(1);
flags.set(3);
flags.flip(1);
std::cout << "flags=" << flags
<< " bit3=" << flags.test(3) << '\n';
}
flags=1000 bit3=1
Comparação entre C e C++
A expressão 1u << n cria um número com apenas o bit n igual a 1. O operador |= liga o bit, ^= inverte o bit, e (flags >> 3) & 1u testa o bit 3. Depois de ligar os bits 1 e 3 e inverter de novo o bit 1, só o bit 3 fica ligado, então flags vale 8. Prefira tipos sem sinal (unsigned) para que os deslocamentos de bits sejam previsíveis. Em C++, std::bitset oferece métodos claros como set() e flip() e imprime o valor em binário.
Laços, ponteiros, tamanhos e buffers temporários são escritos explicitamente.
Iteradores e algoritmos padrão separam o processamento da forma como os dados são guardados.
Exercícios práticos
Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.
- Simule cada comparação no papel.
- Teste com valores repetidos e com valores muito grandes e muito pequenos.
- Meça o tempo do seu código e compare com a biblioteca padrão.
Pratique com um desafio
Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.
- Potência de Dois Verifique se um número é uma potência de dois. Fácil
- Mínimo de Viagens de Elevador Agrupe as pessoas em viagens de elevador, respeitando o limite de peso, usando o menor número possível de viagens. Difícil