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 */