Vous êtes sur la page 1sur 47

Operações com bits

Rodrigo Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ECOP04 Operações com bits rodrigomax@unifei.edu.br 1 / 47


Revisão

Revisão

ECOP04 Operações com bits rodrigomax@unifei.edu.br 2 / 47


Revisão

Tipos de dados em C (rev)

Tipo Bits Bytes Faixa de valores


char 8 1 -128 à 127
int 16 2 -32.768 à 32.767
float 32 4 3,4 x 10-38 à 3,4 x 1038
double 64 8 3,4 x 10-308 à 3,4 x 10308

ECOP04 Operações com bits rodrigomax@unifei.edu.br 3 / 47


Revisão

Conversão Binário, Decimal, Hexadecimal(rev)

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 4 / 47


Revisão

Conversão Binário, Decimal, Hexadecimal(rev)

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 5 / 47


Revisão

Conversão Binário, Decimal, Hexadecimal(rev)

Base Hexadecimal
Possui 16 “unidades”diferentes.
10 algarismos mais 6 letras
Facilita escrita de valores binários
Fácil conversão bin-hex

ECOP04 Operações com bits rodrigomax@unifei.edu.br 6 / 47


Revisão

Conversão Binário, Decimal, Hexadecimal(rev)

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 7 / 47


Operações com bits

Operações com bits

ECOP04 Operações com bits rodrigomax@unifei.edu.br 8 / 47


Operações com bits

Operações com bits

Operação lógica NOT

A !A
0 1
1 0

ECOP04 Operações com bits rodrigomax@unifei.edu.br 9 / 47


Operações com bits

Operações com bits

ECOP04 Operações com bits rodrigomax@unifei.edu.br 10 / 47


Operações com bits

Operações com bits

Declaração Lógico Bitwise

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 11 / 47


Operações com bits

Operações com bits

Operação lógica AND

A B A&&B
0 0 0
0 1 0
1 0 0
1 1 1

ECOP04 Operações com bits rodrigomax@unifei.edu.br 12 / 47


Operações com bits

Operações com bits

ECOP04 Operações com bits rodrigomax@unifei.edu.br 13 / 47


Operações com bits

Operações com bits

Declaração Lógico Bitwise

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 14 / 47


Operações com bits

Operações com bits

Operação lógica OR

A B A||B
0 0 0
0 1 1
1 0 1
1 1 1

ECOP04 Operações com bits rodrigomax@unifei.edu.br 15 / 47


Operações com bits

Operações com bits

ECOP04 Operações com bits rodrigomax@unifei.edu.br 16 / 47


Operações com bits

Operações com bits

Declaração Lógico Bitwise

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 17 / 47


Operações com bits

Operações com bits

Operação lógica XOR

A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0

ECOP04 Operações com bits rodrigomax@unifei.edu.br 18 / 47


Operações com bits

Operações com bits

ECOP04 Operações com bits rodrigomax@unifei.edu.br 19 / 47


Operações com bits

Operações com bits

Declaração Lógico Bitwise

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 20 / 47


Operações com bits

Operações com bits

A operação shift desloca os bits


Para a esquerda operador <<
Para direita operador >>
É necessário indicar quantas casas serão deslocadas

ECOP04 Operações com bits rodrigomax@unifei.edu.br 21 / 47


Operações com bits

Operações com bits

Declaração Shift Esquerda Shift Direita

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 22 / 47


Operações com bits

Operações com bits

memória

unsigned char before; 7 6 5 4 3 2 1 0


unsigned char after; 1 0 1 1 1 0 0 1 before
before = 0xB9;
0
after = before << 1;
//after = 0x72 0 1 1 1 0 0 1 0 after

ECOP04 Operações com bits rodrigomax@unifei.edu.br 23 / 47


Operações com bits

Operações com bits

Shift Lógico
memória

unsigned char before; 7 6 5 4 3 2 1 0


unsigned char after; 1 0 1 1 1 0 0 1 before
before = 0xB9;
0
after = before >> 1;
//after = 0x5C 0 1 0 1 1 1 0 0 after

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 24 / 47


Operações com bits

Operações com bits

memória

unsigned char before; 7 6 5 4 3 2 1 0


unsigned char after; 0 0 1 1 1 0 0 1 before
before = 0x39;
after = ROT_RIGHT(before,1);
//after = 0x9C 1 0 0 1 1 1 0 0 after

memória

unsigned char before; 7 6 5 4 3 2 1 0


unsigned char after; 0 0 1 1 1 0 0 1 before
before = 0x39;
after = ROT_LEFT(before, 1);
//after = 0x72 0 1 1 1 0 0 1 0 after

ECOP04 Operações com bits rodrigomax@unifei.edu.br 25 / 47


Operações com um único bit

Operações com um único bit

ECOP04 Operações com bits rodrigomax@unifei.edu.br 26 / 47


Operações com um único bit

Operações com bits

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

Posição N ... X+1 X X-1 ... 0


Valor 0 ... 0 1 0 ... 0

ECOP04 Operações com bits rodrigomax@unifei.edu.br 27 / 47


Operações com um único bit

Operações com bits

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

Posição N ... X+1 X X-1 ... 0


Valor 1 ... 1 0 1 ... 1

ECOP04 Operações com bits rodrigomax@unifei.edu.br 28 / 47


Operações com um único bit

Operações com bits

Trocar o valor de um bit


Criar uma ”máscara”cheia de 0 (zeros) e com 1 (um) apenas na
posição desejada
Fazer uma operação XOR entre a variável e a máscara

Posição N ... X+1 X X-1 ... 0


Valor 0 ... 0 1 0 ... 0

ECOP04 Operações com bits rodrigomax@unifei.edu.br 29 / 47


Operações com um único bit

Linguagem C
Operações com bits

Verificar o estado de um bit


Criar uma ”máscara”cheia de 0 (zeros) e com 1 (um) apenas na
posição desejada
Fazer uma operação AND entre a variável e a máscara
Não atribuir o resultado à variável

Posição N ... X+1 X X-1 ... 0


Valor 0 ... 0 1 0 ... 0

ECOP04 Operações com bits rodrigomax@unifei.edu.br 30 / 47


Operações com defines

Operações com defines

ECOP04 Operações com bits rodrigomax@unifei.edu.br 31 / 47


Operações com defines

Operações com defines

Operação Bit set

1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg | mascara ;

1 arg |= (1 < < bit )


Uma linha

1 # define BitSet ( arg , bit ) (( arg ) |= (1 < < bit ) )


Com define

ECOP04 Operações com bits rodrigomax@unifei.edu.br 32 / 47


Operações com defines

Operações com defines

Operação Bit clear

1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg & ~ mascara ;

1 arg &= ~( 1 < < bit )


Uma linha

1 # define BitClr ( arg , bit ) (( arg ) &= ←-


Com define ~( 1 < < bit ) )

ECOP04 Operações com bits rodrigomax@unifei.edu.br 33 / 47


Operações com defines

Operações com defines

Operação Bit flip

1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 arg = arg ^ mascara ;

1 arg ^= (1 < < bit )


Uma linha

1 # define BitFlp ( arg , bit ) (( arg ) ^= (1 < < bit ) )


Com define

ECOP04 Operações com bits rodrigomax@unifei.edu.br 34 / 47


Operações com defines

Operações com defines

Operação Bit test

1 char bit = 2 ;
2 char mascara ;
Passo a Passo 3 mascara = 1 << bit ;
4 if ( arg & mascara ) { }

1 if ( arg & (1 < < bit ) ) { }


Uma linha

1 # define BitTst ( arg , bit ) (( arg ) & (1 < < bit ) )


Com define

ECOP04 Operações com bits rodrigomax@unifei.edu.br 35 / 47


Debug

Debug

ECOP04 Operações com bits rodrigomax@unifei.edu.br 36 / 47


Debug

Debug de sistemas embarcados

ECOP04 Operações com bits rodrigomax@unifei.edu.br 37 / 47


Debug

Debug de sistemas embarcados

Tipos de bugs:
Bohrbug
Mandelbug
Heisenbug
Schroedinbug

ECOP04 Operações com bits rodrigomax@unifei.edu.br 38 / 47


Debug

Debug de sistemas embarcados

Bohrbug
Bug “bem comportado”
É possı́vel repetir o bug
Não se altera com observação

Niels H. D. Bohr

ECOP04 Operações com bits rodrigomax@unifei.edu.br 39 / 47


Debug

Debug de sistemas embarcados

Mandelbug
Oposto do Bohrbug
Tem causas extremamente
complicadas
Parece ter comportamento
caótico e indeterminado

Benoı̂t B. Mandelbrot

ECOP04 Operações com bits rodrigomax@unifei.edu.br 40 / 47


Debug

Debug de sistemas embarcados

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 41 / 47


Debug

Debug de sistemas embarcados

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 42 / 47


Como debuggar sistemas embarcados?

Como debuggar sistemas embarcados?

ECOP04 Operações com bits rodrigomax@unifei.edu.br 43 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

Como debugar sistemas embarcados?


Externalizar as informações
Programação incremental
Checar possı́veis pontos de memory-leak
Existe possibilidade de fragmentação da memória?
Otimização de código
Reproduzir e isolar o erro

ECOP04 Operações com bits rodrigomax@unifei.edu.br 44 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 45 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 46 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

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

ECOP04 Operações com bits rodrigomax@unifei.edu.br 47 / 47

Vous aimerez peut-être aussi