Máscaras de bits e flags
Defina, limpe e alterne bits.
Máscaras de bits e flags é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.
Bits como sinalizadores
Um único inteiro pode armazenar várias configurações de ligado/desligado, uma por bit. Cada bit é um sinalizador.
Isso é compacto e rápido, sendo comum em sistemas operacionais e código embarcado.
#include <stdio.h>
int main(void) {
unsigned flags = 0;
printf("Initial flags = %u\n", flags);
return 0;
}Definindo máscaras
Uma máscara é um valor com bits específicos definidos. Defina cada sinalizador como uma potência de dois para que ele ocupe seu próprio bit.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
printf("READ=%u WRITE=%u EXEC=%u\n", READ, WRITE, EXEC);
return 0;
}Definindo um bit
Para ativar um sinalizador, faça OR do valor com a máscara: flags |= MASK.
Os bits que já estão definidos continuam definidos.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = 0;
flags |= READ;
flags |= WRITE;
printf("flags = %u\n", flags);
return 0;
}Limpando um bit
Para desativar um sinalizador, faça AND com a máscara invertida: flags &= ~MASK.
A máscara invertida tem 0 no bit-alvo e 1 em todos os outros bits.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ | WRITE;
flags &= ~WRITE;
printf("flags = %u\n", flags);
return 0;
}Alternando um bit
Para inverter um sinalizador, faça XOR com a máscara: flags ^= MASK.
Se ele estava ativado, será desativado, e vice-versa.
#include <stdio.h>
#define EXEC (1u << 2)
int main(void) {
unsigned flags = 0;
flags ^= EXEC;
printf("after toggle: %u\n", flags);
flags ^= EXEC;
printf("after toggle: %u\n", flags);
return 0;
}Testando um bit
Para verificar se um sinalizador está ativado, faça AND com a máscara e teste o resultado: flags & MASK é diferente de zero quando o bit está definido.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ;
if (flags & READ) printf("READ is on\n");
if (flags & WRITE) printf("WRITE is on\n");
else printf("WRITE is off\n");
return 0;
}Definindo vários sinalizadores
Combine máscaras com OR para definir vários sinalizadores de uma só vez.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
unsigned flags = READ | WRITE | EXEC;
printf("all set: %u\n", flags);
return 0;
}Verificando vários de uma só vez
Para testar se todos os sinalizadores de um grupo estão definidos, faça AND com a máscara combinada e compare o resultado com a própria máscara.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
int main(void) {
unsigned flags = READ | WRITE;
unsigned need = READ | WRITE;
if ((flags & need) == need) printf("both present\n");
return 0;
}Exibindo sinalizadores ativos
Percorra suas máscaras para informar quais sinalizadores estão ativados no momento.
#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)
int main(void) {
unsigned flags = READ | EXEC;
if (flags & READ) printf("R");
if (flags & WRITE) printf("W");
if (flags & EXEC) printf("X");
printf("\n");
return 0;
}Contando bits definidos
Para saber quantos sinalizadores estão ativados, conte os bits definidos limpando repetidamente o bit definido de menor ordem.
#include <stdio.h>
int main(void) {
unsigned v = 0b10110;
int count = 0;
while (v) {
v &= (v - 1);
count++;
}
printf("set bits = %d\n", count);
return 0;
}Enumerações para sinalizadores
Usar um enum mantém as definições dos sinalizadores organizadas e legíveis.
#include <stdio.h>
enum { OPT_A = 1, OPT_B = 2, OPT_C = 4 };
int main(void) {
unsigned opts = OPT_A | OPT_C;
printf("opts = %u\n", opts);
if (opts & OPT_C) printf("C enabled\n");
return 0;
}Verificação rápida
Teste seus conhecimentos sobre máscaras e sinalizadores.
Recapitulação
Você aprendeu a gerenciar sinalizadores de bits:
- Defina com
flags |= MASK. - Limpe com
flags &= ~MASK. - Alterne com
flags ^= MASK. - Teste com
flags & MASK. - Defina máscaras como potências de dois, geralmente com macros ou enumerações.
Perguntas Frequentes
A aula “Máscaras de bits e flags” é grátis?
Sim — o texto completo de “Máscaras de bits e flags” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.
O que vou aprender em “Máscaras de bits e flags”?
Defina, limpe e alterne bits. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C Academy?
Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Máscaras de bits e flags”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C Academy?
Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Operadores bit a bit
- Deslocamentos
- Máscaras de bits e flags
- Truques práticos com bits