Académique Documents
Professionnel Documents
Culture Documents
Rodrigo Almeida
rodrigomax@unifei.edu.br
Revisão
Conversão Binário-decimal
Dividir o número por 2
Anotar o valor do resto (0 ou 1)
Se o valor é maior que 0 voltar ao número 1
Escrever os valores obtidos através do passo 2 de trás para frente.
Apresentar o resultado
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
Base Hexadecimal
Possui 16 “unidades”diferentes.
10 algarismos mais 6 letras
Facilita escrita de valores binários
Fácil conversão bin-hex
A !A
0 1
1 0
1 result = ~ A ;
2 // result = 243
1 char A = 12 ;
1 result = ! A ; 3 // A = ←-
2 // A = ←-
2 // result = 0 0b00001100
0b00001100
4 // r = ←-
0b11110011
A B A&&B
0 0 0
0 1 0
1 0 0
1 1 1
1 result = A & B ;
1 char A = 8 ; 2 // result = 0
2 // A = ←- 3 // A = ←-
1 result = A ←-
0b00001000 0b00001000
&& B ;
3 char B = 5 ; 4 // B = ←-
2 // result = 1
4 // B = ←- 0b00000101
0b00000101 5 // r = ←-
0b00000000
Operação lógica OR
A B A||B
0 0 0
0 1 1
1 0 1
1 1 1
1 result = A | B ;
1 char A = 8 ; 2 // result = 13
2 // A = ←- 3 // A = ←-
1 result = A ←-
0b00001000 0b00001000
|| B ;
3 char B = 5 ; 4 // B = ←-
2 // result = 1
4 // B = ←- 0b00000101
0b00000101 5 // r = ←-
0b00001101
A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0
1 result = A ^ B ;
1 char A = 8 ; 2 // result = 13
2 // A = ←- 3 // A = ←-
0b00001000 1 a o ←-
// n~ 0b00001000
3 char B = 5 ; existe em C 4 // B = ←-
4 // B = ←- 0b00000101
0b00000101 5 // r = ←-
0b00001101
1 result = A ←- 1 result = A ←-
<< 2 ; >> 2 ;
1 char A = 8 ; 2 // result = 32 2 // result = 2
2 // A = ←- 3 // A = ←- 3 // A = ←-
0b00001000 0b00001000 0b00001000
4 // r = ←- 4 // r = ←-
0b00100000 0b00000010
memória
Shift Lógico
memória
Shift Aritmético
memória
char before; 7 6 5 4 3 2 1 0
char after; 1 0 1 1 1 0 0 1 before
before = 0xB9;
after = before >> 1;
//after = 0xDC 1 1 0 1 1 1 0 0 after
memória
memória
Ligar um bit
Criar uma “máscara”cheia de 0 (zeros) e com 1 (um) apenas na
posição desejada
Fazer uma operação OR entre a variável e a máscara
Desligar um bit
Criar uma ”máscara”cheia de 1 (uns) e com 0 (zero) apenas na
posição desejada
Fazer uma operação AND entre a variável e a máscara
Linguagem C
Operações com bits
1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg | mascara ;
1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg & ~ mascara ;
1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg ^ mascara ;
1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 if ( arg & mascara ) { }
Debug
Tipos de bugs:
Bohrbug
Mandelbug
Heisenbug
Schroedinbug
Bohrbug
Bug “bem comportado”
É possı́vel repetir o bug
Não se altera com observação
Niels H. D. Bohr
Mandelbug
Oposto do Bohrbug
Tem causas extremamente
complicadas
Parece ter comportamento
caótico e indeterminado
Benoı̂t B. Mandelbrot
Heisenbug
A utilização de ferramentas de
debug fazem o bug
desaparecer
Pode estar ligado a operações
temporais, paralelismo de
funções
Intertravamento e obtenção
de recursos
Werner K. Heisenberg
Schroedinbug
Um programa está
funcionando
Ao olhar o código descobre-se
que ele não devia funcionar
A partir deste momento o
programa para de funcionar
Erwin R. J. A.
Schrödinger
Externalizar as informações
Cuidado com overhead
Separar alguns leds apenas para debug
Enviar sinais via serial apenas se necessário
Usar um emulador para obter informações
Programação incremental
Apenas inserir mais funções depois de ter uma primeira versão funcional
Testar após cada alteração do código
Checar possı́veis pontos de memory-leak
Verificar se cada malloc() possui seu free()
Existe possibilidade de fragmentação da memória?
Repensar rotinas que utilizam malloc() e free() demasiadamente
Otimização de código
Nunca otimizar se não for necessário
Se achar que é necessário utilizar um profiler antes
Verificar as otimizações já 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ções problemáticas