Sie sind auf Seite 1von 47

Operacoes com bits

Rodrigo Almeida

Universidade Federal de Itajuba

rodrigomax@unifei.edu.br

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 1 / 47


Revisao

Revisao

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 2 / 47


Revisao

Tipos de dados em C (rev)

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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 3 / 47


Revisao

Conversao Binario, Decimal, Hexadecimal(rev)

Conversao Binario-decimal
Dividir o numero por 2
Anotar o valor do resto (0 ou 1)
Se o valor e maior que 0 voltar ao numero 1
Escrever os valores obtidos atraves do passo 2 de tras para frente.
Apresentar o resultado

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 4 / 47


Revisao

Conversao Binario, Decimal, Hexadecimal(rev)

Bit nmero 7 6 5 4 3 2 1 0
Potncia de 2 27 26 25 24 23 22 21 20
Valor em decimal 128 64 32 16 8 4 2 1

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 5 / 47


Revisao

Conversao Binario, Decimal, Hexadecimal(rev)

Base Hexadecimal
Possui 16 unidadesdiferentes.
10 algarismos mais 6 letras
Facilita escrita de valores binarios
Facil conversao bin-hex

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 6 / 47


Revisao

Conversao Binario, 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 Operacoes com bits rodrigomax@unifei.edu.br 7 / 47


Operacoes com bits

Operacoes com bits

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 8 / 47


Operacoes com bits

Operacoes com bits

Operacao logica NOT

A !A
0 1
1 0

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 9 / 47


Operacoes com bits

Operacoes com bits

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 10 / 47


Operacoes com bits

Operacoes com bits

Declaracao Logico 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 Operacoes com bits rodrigomax@unifei.edu.br 11 / 47


Operacoes com bits

Operacoes com bits

Operacao logica AND

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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 12 / 47


Operacoes com bits

Operacoes com bits

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 13 / 47


Operacoes com bits

Operacoes com bits

Declaracao Logico 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 Operacoes com bits rodrigomax@unifei.edu.br 14 / 47


Operacoes com bits

Operacoes com bits

Operacao logica OR

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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 15 / 47


Operacoes com bits

Operacoes com bits

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 16 / 47


Operacoes com bits

Operacoes com bits

Declaracao Logico 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 Operacoes com bits rodrigomax@unifei.edu.br 17 / 47


Operacoes com bits

Operacoes com bits

Operacao logica XOR

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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 18 / 47


Operacoes com bits

Operacoes com bits

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 19 / 47


Operacoes com bits

Operacoes com bits

Declaracao Logico 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 Operacoes com bits rodrigomax@unifei.edu.br 20 / 47


Operacoes com bits

Operacoes com bits

A operacao shift desloca os bits


Para a esquerda operador <<
Para direita operador >>
E necessario indicar quantas casas serao deslocadas

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 21 / 47


Operacoes com bits

Operacoes com bits

Declaracao 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 Operacoes com bits rodrigomax@unifei.edu.br 22 / 47


Operacoes com bits

Operacoes com bits

memria

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 Operacoes com bits rodrigomax@unifei.edu.br 23 / 47


Operacoes com bits

Operacoes com bits

Shift Logico
memria

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 Aritmetico
memria

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 Operacoes com bits rodrigomax@unifei.edu.br 24 / 47


Operacoes com bits

Operacoes com bits

memria

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

memria

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 Operacoes com bits rodrigomax@unifei.edu.br 25 / 47


Operacoes com um unico bit

Operacoes com um unico bit

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 26 / 47


Operacoes com um unico bit

Operacoes com bits

Ligar um bit
Criar uma mascaracheia de 0 (zeros) e com 1 (um) apenas na
posicao desejada
Fazer uma operacao OR entre a variavel e a mascara

Posicao N ... X+1 X X-1 ... 0


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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 27 / 47


Operacoes com um unico bit

Operacoes com bits

Desligar um bit
Criar uma mascaracheia de 1 (uns) e com 0 (zero) apenas na
posicao desejada
Fazer uma operacao AND entre a variavel e a mascara

Posicao N ... X+1 X X-1 ... 0


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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 28 / 47


Operacoes com um unico bit

Operacoes com bits

Trocar o valor de um bit


Criar uma mascaracheia de 0 (zeros) e com 1 (um) apenas na
posicao desejada
Fazer uma operacao XOR entre a variavel e a mascara

Posicao N ... X+1 X X-1 ... 0


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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 29 / 47


Operacoes com um unico bit

Linguagem C
Operacoes com bits

Verificar o estado de um bit


Criar uma mascaracheia de 0 (zeros) e com 1 (um) apenas na
posicao desejada
Fazer uma operacao AND entre a variavel e a mascara
Nao atribuir o resultado a variavel

Posicao N ... X+1 X X-1 ... 0


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

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 30 / 47


Operacoes com defines

Operacoes com defines

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 31 / 47


Operacoes com defines

Operacoes com defines

Operacao 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 Operacoes com bits rodrigomax@unifei.edu.br 32 / 47


Operacoes com defines

Operacoes com defines

Operacao 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 Operacoes com bits rodrigomax@unifei.edu.br 33 / 47


Operacoes com defines

Operacoes com defines

Operacao 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 Operacoes com bits rodrigomax@unifei.edu.br 34 / 47


Operacoes com defines

Operacoes com defines

Operacao 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 Operacoes com bits rodrigomax@unifei.edu.br 35 / 47


Debug

Debug

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 36 / 47


Debug

Debug de sistemas embarcados

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 37 / 47


Debug

Debug de sistemas embarcados

Tipos de bugs:
Bohrbug
Mandelbug
Heisenbug
Schroedinbug

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 38 / 47


Debug

Debug de sistemas embarcados

Bohrbug
Bug bem comportado
E possvel repetir o bug
Nao se altera com observacao

Niels H. D. Bohr

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 39 / 47


Debug

Debug de sistemas embarcados

Mandelbug
Oposto do Bohrbug
Tem causas extremamente
complicadas
Parece ter comportamento
caotico e indeterminado

Benot B. Mandelbrot

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 40 / 47


Debug

Debug de sistemas embarcados

Heisenbug
A utilizacao de ferramentas de
debug fazem o bug
desaparecer
Pode estar ligado a operacoes
temporais, paralelismo de
funcoes
Intertravamento e obtencao
de recursos

Werner K. Heisenberg

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 41 / 47


Debug

Debug de sistemas embarcados

Schroedinbug
Um programa esta
funcionando
Ao olhar o codigo descobre-se
que ele nao devia funcionar
A partir deste momento o
programa para de funcionar

Erwin R. J. A.
Schrodinger

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 42 / 47


Como debuggar sistemas embarcados?

Como debuggar sistemas embarcados?

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 43 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

Como debugar sistemas embarcados?


Externalizar as informacoes
Programacao incremental
Checar possveis pontos de memory-leak
Existe possibilidade de fragmentacao da memoria?
Otimizacao de codigo
Reproduzir e isolar o erro

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 44 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

Externalizar as informacoes
Cuidado com overhead
Separar alguns leds apenas para debug
Enviar sinais via serial apenas se necessario
Usar um emulador para obter informacoes

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 45 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

Programacao incremental
Apenas inserir mais funcoes depois de ter uma primeira versao funcional
Testar apos cada alteracao do codigo
Checar possveis pontos de memory-leak
Verificar se cada malloc() possui seu free()
Existe possibilidade de fragmentacao da memoria?
Repensar rotinas que utilizam malloc() e free() demasiadamente

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 46 / 47


Como debuggar sistemas embarcados?

Debug de sistemas embarcados

Otimizacao de codigo
Nunca otimizar se nao for necessario
Se achar que e necessario utilizar um profiler antes
Verificar as otimizacoes ja 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 funcoes problematicas

ECOP04 Operacoes com bits rodrigomax@unifei.edu.br 47 / 47

Das könnte Ihnen auch gefallen