linguagem de programação i

Propaganda
LINGUAGEM DE PROGRAMAÇÃO I
AULA 18 – Sistemas numéricos e os operadores bit-a-bit
OBJETIVOS: Apresentar uma discussão sobre os operadores bit-a-bit e o conceito
de campo de bits.
1 Motivação
 Muitos programas precisam manipular bits individuais dentro de um byte;
 Ser capaz de operar ao nível de bit é especialmente importante quando o
programa deve atuar diretamente no hardware da máquina; isto porque
periféricos de hardware freqüentemente requerem a cesso na forma de bits
individuais em vez de aceitarem dados na forma de bytes como caracteres
ou inteiros.
 A manipulação de bits exige o conhecimento de como o computador utiliza
os sistemas numéricos binários, octal e hexadecimal.
2 O sistema numérico binário
 O sistema numérico binário tem a base numérica dois, isto é, usa dois
dígitos (0 e 1) para representar qualquer quantidade;
 Cada dígito binário (bit) pode representar somente a situação ligado ( 1 ) ou
desligado ( 0 );
 O computador numera os bits de uma variável da direita para a esquerda;
 O bit 0 é chamado de bit menos significativo e o bit 7 é o bit mais
significativo de um char.
7 6 5 4 3 2 1 0



Como um bit pode estar ligado ( 1 ) ou desligado ( 0 ), um dado
armazenado em 8 bits pode Ter 256 ( 2 8 ) combinações distintas;
O valor numérico decimal de um bit ligado é 2 elevado à potência igual a
sua posição;
A soma dos valores decimais dos bits ligados de um byte representa o seu
valor decimal.
3 O sistema numérico hexadecimal
 O sistema numérico hexadecimal usa a base numérica 16;
 Cada dígito hexadecimal corresponde a 4 dígitos binários, uma vez que a
combinação de 4 dígitos binários pode representar números de 0 a 15 (16
dígitos hexa);
 Para representar um número maior que 15 decimal deve-se usar o próximo
campo de 4 bits hexa;
 O compilador C reconhece um número em hexadecimal quando encontra
0x imediatamente antes do número hexa:
0x3F == 3 * 161 + 15 * 160 == (63)10
HEXA
BINÁRIO
DECIMAL
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
A
1010
10
B
1011
11
C
1100
12
D
1101
13
E
1110
14
F
1111
15
Tab. 1 Representação em Hexa e binário dos números de 0 a 15
4 O sistema numérico octal
 O sistema numérico octal usa a base numérica 8;
 Cada dígito octal corresponde a 3 dígitos binários, uma vez que a
combinação de 3 dígitos binários pode representar números de 0 a 7 (8
dígitos octal);
 Para representar um número maior que 7 decimal deve-se usar o próximo
campo de 3 bits octal;
 O compilador C reconhece um número em octal quando encontra 0
imediatamente antes do número octal:
036 == 3 * 81 + 6 * 80 == (32)10
OCTAL
BINÁRIO
DECIMAL
0
000
0
1
001
1
2
010
2
3
011
3
4
100
4
5
101
5
6
110
6
7
111
7
Tab. 2 - Representação em Octal e binário dos números de 0 a 7
5 Os operadores bit-a-bit


Operação bit-a-bit refere-se a testar, atribuir ou deslocar os bits efetivos em
um byte ou uma palavra, que correspondem aos tipos de dados char e int.
São 6 os operadores bit-a-bit:
OPERAÇÃO
OPERADOR
E ( AND )
&
OU ( OR )
|
OU EXCLUSIVO (XOR)
^
DESLOCAMENTO À DIREITA
»
DESLOCAMENTO À ESQUERDA
«
COMPLEMENTO
~
Tab. 3 - Operadores bit-a-bit
A
b
a&b
a|b
a^b
~a
0
0
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
0
0
Tab. 4 – Tabela-verdade para alguns operadores bit-a-bit
5.1
O operador AND (&) bit-a-bit
 Como opera: toma dois operandos do mesmo tipo e os compara
bit a bit. Cada bit do resultado é 1, somente quando os dois bits
operandos são 1.
 Possíveis usos:
 Testar se um bit particular está ligado ou desligado (1 ou 0);
 Desligar bits;
 Exemplo:
char x,y ;
x = 0x08;
y = 0xbc;
x == (x & y); /* Verdadeiro */
5.2
O operador OR ( | ) bit-a-bit
 Como opera: toma dois operandos do mesmo tipo e os compara
bit a bit. Cada bit do resultado é 1, quando pelo menos um dos
operandos for 1, dito de outro modo, o resultado é 0 somente
quando ambos os operandos forem 0.
 Possíveis usos:
 Combinar bits de diferentes variáveis em uma variável;
 Ligar bits;

Exemplo:
char x,y,z ;
x = 0x07;
y = 0xd0;
z = (x | y); /* 0xd7 */
5.3
O operador XOR (^) bit-a-bit (OR EXCLUSIVO)
 Como opera: toma dois operandos do mesmo tipo e os compara
bit a bit. O bit resultante é 1 somente se os bits forem diferentes,
do contrário o bit resultante é 0.
 Utilização: também pode ser usado para ligar bits desligados e
vice-versa e em rotinas de criptografia.
 Exemplo:
char x,y,z ;
x = 0x0c;
y = 0x0a;
z = (x ^ y); /* 0x06 */
z= (z ^ y); /* 0x0c */
5.4
O operador (~) bit-a-bit (de complemento)
 Como opera: opera sobre um único operando, trocando os bits 1
do operando por 0 e os bits 0 do operando por 1.
 Utilização: pode ser usado em rotinas de criptografia.
 Exemplo:
char ch,x ;
do {
ch=getch();
x=~ch;
printf(“\n%c ”,x);
printf(“%c”,~x);
} while ch != ‘X’;
5.5
O operador (>>) de deslocamento à direita
 Como opera: toma dois operandos, mas age somente sobre a
variável operando colocada à esquerda, deslocando todos os bits
da variável para a direita conforme o número de posições
especificado no segundo operando. Conforme os bits são
deslocados para a direita, zeros são colocados à esquerda.
 Se o bit de sinal é assumido ( tipo char, ao invés de unsigned
char) e o número for negativo (bit mais à esquerda de uma
variável char) 1’s são inseridos á esquerda.
 Utilização: deslocar um bit à direita é o mesmo que dividir o
operando por 2.
 Exemplo:
char x = 0x72;
x>>=1;
printf(“%x”, x); /* 0x39 */
5.6
O operador (<<) de deslocamento à esquerda
 Como opera: toma dois operandos, mas age somente sobre a
variável operando colocada à esquerda, deslocando todos os bits
da variável para a esquerda conforme o número de posições
especificado no segundo operando. Conforme os bits são
deslocados para a esquerda, zeros são colocados à direita.
 Utilização: deslocar um bit à esquerda é o mesmo que multiplicar
o operando por 2.
 Exemplo:
char x = 0x72;
x<<=1;
printf(“%x”, x); /* 0xd4 */
Download