Cursos: Análise, Ciência da Computação e Sistemas de Informação Laboratório I - Prof. Aníbal Notas de aula 2 SISTEMAS NUMÉRICOS Para entender como o computador armazena as informações, é importante conhecer os sistemas de numeração binário, octal e hexadecimal. Sistema decimal É o sistema de numeração que usamos normalmente e no qual escrevemos os valores numéricos em nossos programas. É dito de base e possui dígitos (,, 2,... 8, 9). Cada um desses símbolos tem um valor intrínseco e um valor posicional. O valor posicional é uma potência de que corresponde à posição que o dígito ocupa dentro de um número. Por exemplo, dado o número 4232, o 2 da casa das centenas vale 2 x 2 = 2 x = 2; já o 2 da casa das unidades vale 2 x = 2 x = 2. Ambos têm o mesmo valor intrínseco (2), mas têm valores posicionais diferentes. Assim, 4232 = 4 x 3 + 2 x 2 + 3 x + 2 x = 4 x + 2 x + 3 x + 2 x = 4 + 2 + 3 + 2. Resumindo, os valores posicionais dos dígitos de um número, da direita para a esquerda, são, respectivamente, as pontências de dez:,, 2, 3, e assim por diante, ou seja,,,, etc. Sistema binário É o sistema de base 2, possuindo apenas dois dígitos: e. Devido a sua simplicidade, é o sistema usado internamente pelos computadores para processamento e armazenamento das informações. Como no sistema decimal, cada dígito possui seu valor intrínseco (por exemplo o vale zero ou falso ou desligado; o vale um, ou verdadeiro ou ligado), mas terá valor posicional que depende de sua localização dentro do número. No número binário, o da extremidade esquerda tem valor 4 = x2 2, enquanto o da extremidade direita tem valor = x 2. Então, o número binário = x 2 2 + x 2 + x 2 = x 4 + x 2 + x = 4 + + = 5. Os valores posicionais dos dígitos dentro de um número binário são, da direita para a esquerda, as potências de 2: 2, 2, 2 2, 2 3,, 2 4, etc., isto é,, 2, 4, 8, 6, e assim por diante. Conversão de binário para decimal O que acabamos de mostrar no item anterior é a própria maneira de calcular o valor decimal de um certo número binário. Basta multiplicar cada dígito binário pelo seu valor posicional e somar estes produtos. Ex: qual o valor decimal de? = x 2 5 + x 2 4 + x 2 3 + x 2 2 + x 2 + x 2 = 32 + 6 + 2 = 5 Conversão de decimal para binário Deve-se fazer uma série de divisões inteiras por 2 (aquela que dá um quociente e um resto). Divide-se o número decimal original por 2 e guarda-se o resto; divide-se o quociente da divisão anterior por 2 e guarda-se o resto. Assim procedemos repetidamente, até que o quociente dê zero. O número binário é a seqüência dos restos, na ordem inversa a da sua obtenção. Exemplo: converter o decimal 53 para binário; 53 / 2 = 26, resto 26 / 2 = 3, resto 3 / 2 = 6, resto 6 / 2 = 3, resto 3 / 2 =, resto / 2 =, resto Tomando os restos na ordem inversa, temos. Programação I - Prof. Aníbal - Notas de aula 2
Exercício. Tire a prova, para verificar a correção do resultado. Como você deve lembrar, para tirar a prova faz-se a operação inversa. Sistemas octal e hexadecimal Os números binários são em geral muito extensos. Por exemplo, o valor decimal 25 gastará 7 dígitos binários para a sua escrita:. Os sistemas de numeração octal (de base 8) e hexadecimal (de base 6) se prestam à abreviação de números binários. O sistema octal dispões de 8 dígitos (,, 2, 3, 4, 5, 6 e 7). O sistema hexadecimal utiliza 6 símbolos neste caso, usam-se os dígitos do sistema decimal, mais 6 letras do início do alfabeto (,, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F). Portanto, em hexadecimal, A tem valor intrínseco de, B vale, C vale 2, D vale 3, E vale 4 e o F vale 5. Os valores posicionais do sistema octal são as potências de 8 e do hexadecimal são as potências de 6. Exemplos: O número octal 52 = 5 x 8 2 + x 8 + 2 x 8 = 5 x 64 + x 8 + 2 x = 32 + 2 = 322. O número hexadecimal 3BF = 3 x 6 2 + x 6 + 5 x 6 = 256 + 76 + 5 = 447. Conversão de octal ou hexadecimal para decimal É o processo que acabamos de demonstrar nos dois últimos exemplos, isto é, multiplica-se cada dígito octal ou hexadecimal pelo seu valor posicional e somam-se estes produtos. O resultado é o valor decimal correspondente. Conversão de decimal para octal ou para hexadecimal Aplica-se o mesmo método de divisões sucessivas visto para a conversão de decimal para binário, apenas mudando o divisor de 2 para 8 ou 6, respectivamente. Exemplos: Converter o valor decimal 527 para octal e hexadecimal. 527 / 8 = 65, resto 7 65 / 8 = 8, resto 8 / 8 =, resto / 8 =, resto Tomando os restos na ordem inversa, temos: 7 que é a notação octal do decimal 527. Logo, o resultado é 2F. 527 / 6 = 32, resto 5 = F 32 / 6 = 2, resto 2 / 6 =, resto 2 Programação I - Prof. Aníbal - Notas de aula 2 2
Conversão de binário para octal ou para hexadecimal Aqui é útil usar uma tabela de equivalências dos quatro sistemas usados neste texto: Decimal Binário Octal Hexadecimal 2 3 4 5 6 7 8 9 2 3 4 5 6 2 3 4 5 6 7 2 3 4 5 6 7 2 2 3 4 5 6 7 8 9 A B C D E F Para converter um número binário em octal, divide-se a notação binária em grupos de 3 dígitos binários cada e substitui-se cada grupo pelo seu valor octal correspondente. Exemplo: converter o binário em octal. Inicialmente, separamos o valor dado em grupos de 3 dígitos (completando-se com zeros o grupo mais da esquerda, se necessário): Octal: 7 4 5 Para converter para hexadecimal, apenas muda-se o tamanho de cada grupo para 4 dígitos. Hexadecimal 3 E 5 Logo, o binário vale 745 em octal e 3E5 em hexadecimal. Conversão de octal ou hexadecimal para binário Cada símbolo octal deve ser substituído pelo conjunto de 3 dígitos binários que o representa. Cada símbolo hexadecimal deve ser substituído pelo conjunto de 4 binários que o representa. Exemplo: Converter o octal 57 para binário. 5 7 Exemplo: Qual a notação em binário do hexadecimal CA? C A Java permite representar uma constante inteira em octal, hexadecimal ou decimal. O início da constante determina a base: indica um octal, x ou X indica um hexadecimal. A representação decimal não tem nenhum prefixo. Por exemplo, 43, x2b e 53 representam o mesmo valor inteiro 43. Os comando System.out.printf("%o",5); e System.out.printf("%X",5); imprimem o valor do decimal 5 em octal e em hexadecimal, respectivamente. O método printf proporciona Programação I - Prof. Aníbal - Notas de aula 2 3
vários recursos do fluxo de saída neste caso, serve também para converter um decimal em octal ou em hexadecimal. Bit e Byte NOÇÕES DE ARMAZENAMENTO DE INFORMAÇÕES Bit é abreviatura de binary digit. Corresponde à menor informação que podemos armazenar no computador ( ou ). Todavia, como vimos, a representação binária é extensa. Logo, em um bit o máximo que podemos armazenar é o valor ou o valor. Devido a isso, foi criada uma nova unidade composta de 8 bits, chamada byte, que passou a ser, em geral, a unidade básica de informação. Em Java, um tipo primitivo inteiro pode ser representado de cinco maneiras, dependendo da quantidade de bytes que ele usa para armazenamento: Tipo Bytes int 4 long 8 short 2 byte char 2 Por exemplo, um valor short pode armazenar no máximo o valor positivo = 32.767, que corresponde a todos os bits dos dois bytes ligados (), menos o bit mais à esquerda de todo o conjunto, que é reservado para indicar o sinal do número: indica positivo, indica negativo. Os tipos long, int e byte também adotam o bit de sinal. Representação binária de números negativos Internamente, os computadores realizam a subração a b através da soma de a com o complemento para 2 de b. Obtém-se o complemento para 2 de um número binário somando ao seu complemento para. Para obter o complemento para de um número binário, basta inverter todos os seus bits. Ex: usando a notação Java short s = 49; O tipo short usa 2 bytes, com sinal: Complemento para de 49...... Adicionando... + Complemento para 2 de 49... que corresponde ao -49. Repare que o bit de sinal (mais à esquerda) é. A representação binária usual de um número negativo é o complemento para dois do número positivo. Uma forma de demonstrar a correção disso é somar as representações binárias do número positivo e do seu negativo (complemento para 2), o que resultará na representação do, respeitando a mesma quantidade de bytes em todas as representações. OPERAÇÕES BIT A BIT EM JAVA Em Java, pode-se fazer operações bit a bit com qualquer dos tipos primitivos inteiros. Estas operações permitem manipular a representação binária dos valores. Operadores OU, OU exclusivo, E e Negação Os três primeiros operam sobre dois operandos comparando cada bit de um deles com o bit correspondente do outro. O operador de negação (também chamado de complemento para ) atua sobre apenas um operando. A tabela seguinte mostra a regra de cada um. Programação I - Prof. Aníbal - Notas de aula 2 4
Operadores bit a bit Nome Símbolo Descrição OU (or) Resulta se um ou ambos os bits operandos tem valor. Resulta se ambos os bits forem. OU Exclusivo (xor) ^ Resulta somente quando um dos operandos é. Nos demais casos resulta. E (and) & Resulta somente quando ambos os operandos é. Nos demais casos resulta Negação (not) ou complemento para ~ Inverte o valor do bit para e vice-versa. Exemplos: int a = 8; //Repres. binária: int b = ; //Em binário: int c = a b; //c recebe = int d = a ^ b; //d recebe = 2 int e = a & b; //e recebe = 8 int f = ~a; //f recebe = -9 Os operadores lógicos e && comparam duas expressões booleanas. Em Java, esta avaliação é interrompida quando o resultado final pode ser previsto. Por exemplo, em if (x + y m n + 2)..., se a expressão da esquerda (x+y) for true, Java nem avalia a da direita, pois o resultado da expressão lógica será true independente do valor da segunda expressão. Chama-se isso de avaliação em "curto circuito". Se o programador, todavia, quer forçar a avaliação da segunda expressão, deve usar o operador bit a bit correspondente: if (x + y m n + 2)... Isto pode ser importante se a expressão da direita tem alguma chamada de método que deve ser executada de qualquer forma. Observação similar vale para o operador &, em realação ao &&. Operadores de deslocamento Existem três operadores bit a bit em Java para deslocamento. A operação de deslocamento consiste em deslocar para a direita ou para a esquerda a configuração binária de um certo valor inteiro ou char. Por exemplo, um int de valor representado por. Se for feito um deslocamento para a esquerda de, digamos, 2 posições, teremos, que é a representação binária de 4. Conclui-se que é necessário informar quantas posições se deseja deslocar. A tabela abaixo mostra os operadores de deslocamento, considerando op e op2 operandos inteiros ou char. Nome Sintaxe Descrição op << op2 Deslocamento para a esquerda (shift left) Deslocamento para a direita mantendo o sinal (shift right) op >> op2 Desloca os bits de op para a esquerda na quantidade de bits indicada por op2, preenchendo com s os bits menos significativos. Desloca os bits de op para a direita na quantidade de bits indicada por op2, propagando o bit de sinal. Deslocamento para a direita (shift right) op >>> op2 Desloca os bits de op para a direita na quantidade de bits indicada por op2. Só opera sobre int e long. Programação I - Prof. Aníbal - Notas de aula 2 5
Exemplos: int f = -3; // int g = f << 3; //desloca f para a esquerda 3 posições //g valerá: = -24 int h = f >> 2; //h valerá: = - //o bit de sinal propagou-se por 2 posições, mantendo o //valor negativo int i = f >>> 2;//i valerá: = //.73.74.823 não propagou o bit de sinal e o resultado //virou positivo Usar o operador << para deslocar n posições é equivalente a multiplicar por 2 n. Usar o operador >> para deslocar n posições é equivalente a dividir (divisão inteira) por 2 n. Todos os operadores bit a bit podem ser combinados com atribuição. Ex: x = x & y; pode ser resumida para x &= y; Exercícios. Indique o valor posicional de cada dígito no número decimal 23.59 2. Escreva o valor do exercício em binário, octal e hexadecimal 3. Qual o valor no sistema decimal do octal 77? 4. 923 pode ser a representação de um número octal? Por quê? 5. Qual o valor no sistema decimal da constante Java xac? E no sistema binário? 6. Escreva um método em Java que recebe um string representando um valor binário inteiro e retorna seu valor no sistema decimal na forma de um int. 7. Como é armazenado cada um dos valores abaixo internamente? int i = ; long g = -25; short s = -7; byte b = 27; 8. O que será impresso pelo trecho abaixo? int a = ; int b = 2; System.out.println((a & b) + " " + (a b)); a = 2; System.out.println((a & b) + " " + (a b)); a = ; System.out.println((a & b) + " " + (a b)); 9. O que será impresso? System.out.println((32 >> 3) + " " + (4 << 3) + " " + (32 >>> 3));. O que será impresso? int a = ; for (int i =; i<3; i++) System.out.println(a <<= );. O que será impresso? for (int i = ; i < 2; i <<= 2) System.out.println(i); 2. O que será impresso? for (int i = 44; i > x; i >>= 2) System.out.println(i); Programação I - Prof. Aníbal - Notas de aula 2 6
Respostas. 2., 3., 5, e 9. 2., 26675, 2737. 3. 63. 4. Não, porque o símbolo de maior valor do sistema octal é 7. 5. 258 e. 6. public int converteparadecimal(string bin){ int i = ; int expo = ; for (int p = bin.length() - ; p>=; p--){ if (bin.substring(p, p+).equals("")) i += Math.pow(2, expo); expo++; } return i; } 7. i = g = s = b = 8. 3 9. 4 32 4. Exibe as potências sucessivas de 2, de 2 até 7374824.. Potências sucessivas de 4 menores que 2... 2. 5 25 3 6 3 Programação I - Prof. Aníbal - Notas de aula 2 7