O documento discute operações com bits na linguagem C, incluindo:
1) Tipos de dados em C e suas propriedades de armazenamento de bits;
2) Conversões entre sistemas binário, decimal e hexadecimal;
3) Operações lógicas bit a bit como NOT, AND, OR e XOR;
4) Deslocamentos de bits à esquerda e à direita.
1. Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com
bits
Prof.MSc.Rodrigo Maximiano Antunes de Almeida
Universidade Federal de Itajub´a
rodrigomax@unifei.edu.br
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 1 / 38
2. Linguagem C
Tipos de dados em C
Tipos de dados em C
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 2 / 38
3. Linguagem C
Tipos de dados em C
Tipo Bits Bytes Faixa de valores
char 8 1 -128 `a 127
int 16 2 -32.768 `a 32.767
float 32 4 3,4 x 10-38 `a 3,4 x 1038
double 64 8 3,4 x 10-308 `a 3,4 x 10308
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 3 / 38
4. Linguagem C
Convers˜ao Bin´ario, Decimal, Hexadecimal
Convers˜ao Bin´ario-decimal
Dividir o n´umero por 2
Anotar o valor do resto (0 ou 1)
Se o valor ´e maior que 0 voltar ao n´umero 1
Escrever os valores obtidos atrav´es do passo 2 de tr´as para frente.
Apresentar o resultado
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 4 / 38
5. Linguagem C
Convers˜ao Bin´ario, Decimal, Hexadecimal
Bit número 7 6 5 4 3 2 1 0
Potência de 2 27
26
25
24
23
22
21
20
Valor em decimal 128 64 32 16 8 4 2 1
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 5 / 38
6. Linguagem C
Convers˜ao Bin´ario, Decimal, Hexadecimal
Base Hexadecimal
Possui 16 ”unidades”diferentes.
10 algarismos mais 6 letras
Facilita escrita de valores bin´arios
F´acil convers˜ao bin-hex
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 6 / 38
7. Linguagem C
Convers˜ao Bin´ario, Decimal, Hexadecimal
Dec Bin Hex Dec Bin Hex
0 0000 0 8 1000 8
1 0001 1 9 1001 9
2 0010 2 10 1010 A
3 0011 3 11 1011 B
4 0100 4 12 1100 C
5 0101 5 13 1101 D
6 0110 6 14 1110 E
7 0111 7 15 1111 F
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 7 / 38
8. Linguagem C
Opera¸c˜oes com bits
Opera¸c˜oes com bits
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 8 / 38
9. Linguagem C
Opera¸c˜oes com bits
Opera¸c˜ao l´ogica NOT
A !A
0 1
1 0
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 9 / 38
10. Linguagem C
Opera¸c˜oes com bits
Declara¸c˜ao L´ogico Bitwise
1 char A = 12;
2 // A = 0b00001100
1 result = ! A ;
2 // r e s u l t = 0
1 result = ˜A ;
2 // r e s u l t = 243
3 // A = 0b00001100
4 // r = 0b11110011
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 10 / 38
11. Linguagem C
Opera¸c˜oes com bits
Opera¸c˜ao l´ogica AND
A B A&&B
0 0 0
0 1 0
1 0 0
1 1 1
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 11 / 38
12. Linguagem C
Opera¸c˜oes com bits
Declara¸c˜ao L´ogico Bitwise
1 char A = 8;
2 // A = 0b00001000
3 char B = 5;
4 // B = 0b00000101
1 result = A && B ;
2 // r e s u l t = 1
1 result = A & B ;
2 // r e s u l t = 0
3 // A = 0b00001000
4 // B = 0b00000101
5 // r = 0b00000000
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 12 / 38
13. Linguagem C
Opera¸c˜oes com bits
Opera¸c˜ao l´ogica OR
A B A||B
0 0 0
0 1 1
1 0 1
1 1 1
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 13 / 38
14. Linguagem C
Opera¸c˜oes com bits
Declara¸c˜ao L´ogico Bitwise
1 char A = 8;
2 // A = 0b00001000
3 char B = 5;
4 // B = 0b00000101
1 result = A | | B ;
2 // r e s u l t = 1
1 result = A | B ;
2 // r e s u l t = 13
3 // A = 0b00001000
4 // B = 0b00000101
5 // r = 0b00001101
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 14 / 38
15. Linguagem C
Opera¸c˜oes com bits
Opera¸c˜ao l´ogica XOR
A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 15 / 38
16. Linguagem C
Opera¸c˜oes com bits
Declara¸c˜ao L´ogico Bitwise
1 char A = 8;
2 // A = 0b00001000
3 char B = 5;
4 // B = 0b00000101
1 // n˜ao e x i s t e ←
em C
1 result = A ˆ B ;
2 // r e s u l t = 13
3 // A = 0b00001000
4 // B = 0b00000101
5 // r = 0b00001101
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 16 / 38
17. Linguagem C
Opera¸c˜oes com bits
A opera¸c˜ao shift desloca os bits
Para a esquerda operador <<
Para direita operador >>
´E necess´ario indicar quantas casas ser˜ao deslocadas
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 17 / 38
18. Linguagem C
Opera¸c˜oes com bits
Declara¸c˜ao Shift Esquerda Shift Direita
1 char A = 8;
2 // A = 0b00001000
1 result = A << 2;
2 // r e s u l t = 32
3 // A = 0b00001000
4 // r = 0b00100000
1 result = A >> 2;
2 // r e s u l t = 2
3 // A = 0b00001000
4 // r = 0b00000010
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 18 / 38
19. Linguagem C
Opera¸c˜oes com bits
Ligar um bit
Criar uma ”m´ascara”cheia de 0 (zeros) e com 1 (um) apenas na
posi¸c˜ao desejada
Fazer uma opera¸c˜ao OR entre a vari´avel e a m´ascara
Posi¸c˜ao N . . . X+1 X X-1 . . . 0
Valor 0 . . . 0 1 0 . . . 0
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 19 / 38
20. Linguagem C
Opera¸c˜oes com bits
Desligar um bit
Criar uma ”m´ascara”cheia de 1 (uns) e com 0 (zero) apenas na
posi¸c˜ao desejada
Fazer uma opera¸c˜ao AND entre a vari´avel e a m´ascara
Posi¸c˜ao N . . . X+1 X X-1 . . . 0
Valor 1 . . . 1 0 1 . . . 1
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 20 / 38
21. Linguagem C
Opera¸c˜oes com bits
Trocar o valor de um bit
Criar uma ”m´ascara”cheia de 0 (zeros) e com 1 (um) apenas na
posi¸c˜ao desejada
Fazer uma opera¸c˜ao XOR entre a vari´avel e a m´ascara
Posi¸c˜ao N . . . X+1 X X-1 . . . 0
Valor 0 . . . 0 1 0 . . . 0
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 21 / 38
22. Linguagem C
Opera¸c˜oes com bits
Verificar o estado de um bit
Criar uma ”m´ascara”cheia de 0 (zeros) e com 1 (um) apenas na
posi¸c˜ao desejada
Fazer uma opera¸c˜ao AND entre a vari´avel e a m´ascara
N˜ao atribuir o resultado `a vari´avel
Posi¸c˜ao N . . . X+1 X X-1 . . . 0
Valor 0 . . . 0 1 0 . . . 0
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 22 / 38
23. Linguagem C
Opera¸c˜oes com defines
Opera¸c˜oes com defines
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 23 / 38
24. Linguagem C
Opera¸c˜oes com defines
Opera¸c˜ao Bit set
Passo a Passo
1 char bit = 2;
2 char mascara ;
3 mascara = 1 << bit ;
4 arg = arg | mascara ;
Uma linha 1 arg |= (1<<bit )
Com define 1 #define BitSet ( arg , bit ) (( arg ) |= (1<<bit ) )
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 24 / 38
25. Linguagem C
Opera¸c˜oes com defines
Opera¸c˜ao Bit clear
Passo a Passo
1 char bit = 2;
2 char mascara ;
3 mascara = 1 << bit ;
4 arg = arg & ˜mascara ;
Uma linha 1 arg &= ˜(1<<bit )
Com define 1 #define BitClr ( arg , bit ) (( arg ) &= ˜(1<<bit ) )
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 25 / 38
26. Linguagem C
Opera¸c˜oes com defines
Opera¸c˜ao Bit flip
Passo a Passo
1 char bit = 2;
2 char mascara ;
3 mascara = 1 << bit ;
4 arg = arg ˆ mascara ;
Uma linha 1 arg ˆ= (1<<bit )
Com define 1 #define BitFlp ( arg , bit ) (( arg ) ˆ= (1<<bit ) )
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 26 / 38
27. Linguagem C
Opera¸c˜oes com defines
Opera¸c˜ao Bit test
Passo a Passo
1 char bit = 2;
2 char mascara ;
3 mascara = 1 << bit ;
4 i f ( arg & mascara ) { }
Uma linha 1 i f ( arg & (1<<bit ) ) { }
Com define 1 #define BitTst ( arg , bit ) (( arg ) & (1<<bit ) )
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 27 / 38
28. Linguagem C
Debug de sistemas embarcados
Debug de sistemas embarcados
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 28 / 38
29. Linguagem C
Debug de sistemas embarcados
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 29 / 38
30. Linguagem C
Debug de sistemas embarcados
Tipos de bugs:
Bohrbug
Mandelbug
Heisenbug
Schroedinbug
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 30 / 38
31. Linguagem C
Debug de sistemas embarcados
Bohrbug
Bug ”bem comportado”
´E poss´ıvel repetir o bug
N˜ao se altera com observa¸c˜ao
Niels H. D. Bohr
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 31 / 38
32. Linguagem C
Debug de sistemas embarcados
Mandelbug
Oposto do Bohrbug
Tem causas extremamente
complicadas
Parece ter comportamento
ca´otico e indeterminado
Benoˆıt B. Mandelbrot
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 32 / 38
33. Linguagem C
Debug de sistemas embarcados
Heisenbug
A utiliza¸c˜ao de ferramentas de
debug fazem o bug
desaparecer
Pode estar ligado a opera¸c˜oes
temporais, paralelismo de
fun¸c˜oes
Intertravamento e obten¸c˜ao
de recursos
Werner K. Heisenberg
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 33 / 38
34. Linguagem C
Debug de sistemas embarcados
Schroedinbug
Um programa est´a
funcionando
Ao olhar o c´odigo descobre-se
que ele n˜ao devia funcionar
A partir deste momento o
programa para de funcionar
Erwin R. J. A.
Schr¨odinger
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 34 / 38
35. Linguagem C
Debug de sistemas embarcados
Como debugar sistemas embarcados?
Externalizar as informa¸c˜oes
Programa¸c˜ao incremental
Checar poss´ıveis pontos de memory-leak
Existe possibilidade de fragmenta¸c˜ao da mem´oria?
Otimiza¸c˜ao de c´odigo
Reproduzir e isolar o erro
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 35 / 38
36. Linguagem C
Debug de sistemas embarcados
Externalizar as informa¸c˜oes
Cuidado com overhead
Separar alguns leds apenas para debug
Enviar sinais via serial apenas se necess´ario
Usar um emulador para obter informa¸c˜oes
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 36 / 38
37. Linguagem C
Debug de sistemas embarcados
Programa¸c˜ao incremental
Apenas inserir mais fun¸c˜oes depois de ter uma primeira vers˜ao funcional
Testar ap´os cada altera¸c˜ao do c´odigo
Checar poss´ıveis pontos de memory-leak
Verificar se cada malloc() possui seu free()
Existe possibilidade de fragmenta¸c˜ao da mem´oria?
Repensar rotinas que utilizam malloc() e free() demasiadamente
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 37 / 38
38. Linguagem C
Debug de sistemas embarcados
Otimiza¸c˜ao de c´odigo
Nunca otimizar se n˜ao for necess´ario
Se achar que ´e necess´ario utilizar um profiler antes
Verificar as otimiza¸c˜oes j´a realizadas em busca de overflows, typecasts
inadequados, segmentation faults, etc.
Reproduzir e isolar o erro
Abusar do step-by-step de debug
Testar repetibilidade do erro
Isolar as fun¸c˜oes problem´aticas
ELT024 Programa¸c˜ao de sistemas embarcados: Opera¸c˜oes com bitsrodrigomax@unifei.edu.br 38 / 38