Bits e flags em dispositivos reais
Use máscaras sem sinal para ler e mudar configurações individuais de um dispositivo.
- Ler um valor de oito bits em binário
- Ligar, desligar e testar um bit sem mudar os outros
- Explicar por que firmwares e formatos de arquivo compactos usam máscaras
O C muitas vezes conversa com um dispositivo por meio de um registrador: um pequeno grupo de bits em que cada posição tem um significado. Numa placa de sensores fictícia, o bit 0 controla um LED e o bit 2 controla um alarme. Uma máscara seleciona o bit que você quer. Use valores sem sinal nas operações com bits e mantenha os bits não relacionados intactos.
Experimente
Até 15 XPPrograme a placa de sensores
Resolva as três missões de flags. Preveja os oito bits antes de cada clique. O registrador é simulado aqui; nenhum hardware é acessado.
Mission 1: Turn on LED (bit 0).
Pontuação 0/3A fictional eight-bit device register. Bit 0 controls an LED; bit 2 controls an alarm. The other bits must stay unchanged.
uint8_t flags = 0;
Choose a mask operation to begin.
1#include <stdint.h>
2#include <stdio.h>
3
4int main(void) {
5 uint8_t flags = 0;
6 flags |= 1u; /* set bit 0 */
7 flags |= 1u << 2; /* set bit 2 */
8 printf("%u\n", (unsigned)flags);
9 flags &= (uint8_t)~1u; /* clear bit 0 */
10 printf("%u\n", (unsigned)flags);
11 printf("%s\n", (flags & (1u << 2)) ? "alarm on" : "alarm off");
12 return 0;
13}5 4 alarm on
| liga os bits selecionados, & ~mask desliga os bits selecionados e & mask os testa. ^ inverte bits. Deslocamentos como 1u << 2 levam um 1 até o bit 2. Mantenha a quantidade de deslocamento dentro da largura do tipo sem sinal; deslocamentos inválidos são comportamento indefinido. O exercício usa um modelo minúsculo de dispositivo, mas o mesmo padrão aparece em drivers embarcados, cabeçalhos de protocolos e permissões de arquivos.
Principais conclusões
Uma máscara seleciona posições de bits sem mexer em flags não relacionadas.
Use valores sem sinal e quantidades de deslocamento válidas nas operações com bits.
OR liga, AND com uma máscara complementada desliga, AND testa.
Quiz da aula
4 perguntas · aprovação com 3 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Pratique: escreva código em C
Estes exercícios rodam de verdade. Escreva o programa, clique em “Executar testes” e leia o que o compilador informa: aprender a ler as mensagens do compilador é metade do aprendizado de C.
Aplique comandos ao dispositivo
Leia um valor inicial do registrador de 0 a 255 e um comando: LED_ON, ALARM_ON ou LED_OFF. Mude só o bit relevante e imprima o valor decimal final. Por exemplo, 1 ALARM_ON imprime 5.
- Ligar o alarme, manter o LED
- Desligar o LED, manter o alarme
- Ligar o LED, manter os outros bits
Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…