SISTEMAS DE NUMERAÇÃO


  Comumente nos deparamos com as expressões: decimal, hexadecimal, binário e octal. Afinal, o que isso vem a ser?
  O sistema de numeração que utilizamos é o sistema decimal, composto por 10 dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.
  Os demais números são compostos pela combinação dos símbolos decimais elementares, como por exemplo 1765.
  Os números são divididos em casas decimais. Ex:

Casa decimal Milhar Centena Dezena Unidade
Número 1 7 6 5

  Contamos os números em seqüência, de 0 a 9. Quando o valor máximo 9 é atingido e necessitamos aumentar em uma unidade o valor do número, aumentamos o valor da próxima casa decimal à esquerda e retornamos ao valor inicial na casa corrente ou o 0. Ex:
  du  -> Casa decimal

  09
+ 01
  --
  10
  De forma análoga, quando diminuimos de uma unidade uma casa decimal que contém o valor 0 (mínimo), diminuimos em uma unidade a casa decimal imediatamente à sua direita e a casa atual vai para o valor máximo 9. Ex:
  du  -> Casa decimal

  10
- 01
  --
  09
  Os sistemas de numeração apresentados, se diferem quanto à quantidade de dígitos utilizados. Assim temos:

Sistema No. Dígitos Símbolos
Binário 2 0, 1
Octal 8 0, 1, 2, 3, 4, 5, 6, 7
Decimal 10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Hexadecimal 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

  Todo sistema de numeração irá respeitar as regras das casas decimais apresentados. Assim, por exemplo, quando o sistema binário atingir o número máximo 1, irá incremetar a casa imediatamente à direita e retornar ao valor zero na casa corrente.
  A seguir um exemplo de numeração completa de 0 a 16 em decimal e os valores correspondentes dos outros sistemas:

Sistema
Decimal Binário Hexadecimal Octal
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 8 10
9 1001 9 11
10 1010 A 12
11 1011 B 13
12 1100 C 14
13 1101 D 15
14 1110 E 16
15 1111 F 17
16 10000 10 20
... ... ... ...
Obs: os valores que atingiram o máximo permitido para cada casa de unidade
em seu respectivo sistema é assinalado em vermelho.


  Por que utilizar outros sistemas de numeração?
  Primeiro, porque o sistema binário é largamente utilizado em eletrônica e computação como a representação dos estados de ligado (valor 1) e desligado (valor 2).
  Segundo, porque o sistema hexadecimal é visualmente mais elegante e prático do que o decimal para a análise de dados. Note, pela tabela de correspondência entre sistemas acima, que os sistemas binários e hexadecimal, por serem múltiplos, possuem uma correlação perfeita para fazer a conversão entre sistemas diretamente. O mesmo não pode ser aplicado entre os outros sistemas e o sistema decimal.
  Seja o endereço de memória 54672 (em decimal), qual o seu correspondente em binário? Tem que fazer conta ...
  Entretanto, se esse endereço estivesse no sistema hexadecimal (valor D590), bastaria consultar a tabela de conversões e preencher os valores. Assim, teríamos:
   D    5    9    0   -> Hexadecimal
1101 0101 1001 0000   -> Binário
  Obs: Temos que preencher sempre com 4 dígitos a conversão de tabela entre os sistemas hexadecimal e binário.


  CONVERTENDO SISTEMAS DE NUMERAÇÃO EM PASCAL

  O Pascal do MSX não possui funções nativas de conversão entre sistemas de numeração. O máximo que oferece é aceitar um número em hexadecimal, utilizando-se o símbolo dólar($) antes do número. Ex:
num := $A0;
  A seguir, serão apresentados algumas rotinas de conversão entre sistemas.

  Rotina 1: conversão entre qualquer sistema até para decimal.
function potencia(num, n : integer) : longint;
begin
  potencia := 1;

  while (n > 0) do
  begin
    potencia := potencia * num;
    n := n - 1;
  end;
end;

function sistema_para_decimal(num, base : integer) : integer;
var i : integer;
begin
  sistema_para_decimal := 0;
  i := 0;

  while num > 0 do
  begin
    sistema_para_decimal := sistema_para_decimal + potencia(base, i) * (num mod 10);
    num := num div 10;
    i := i + 1;
  end;
end;

begin
  writeln('Binario 100 para decimal: ', sistema_para_decimal(100, 2));
  writeln('Octal 11 para decimal: ', sistema_para_decimal(11, 8));
  writeln('Sistema (base 4) 12 para decimal: ', sistema_para_decimal(12, 4));
end.
Saída:
Binario 100 para decimal: 4
Octal 11 para decimal: 9
Sistema (base 4) 12 para decimal: 6

  Obs: Base é quantidade de algarismos de um sistema de numeração. Assim, decimal é base 10, octal é base 8, binário é base 2 e hexadecimal é base 16.

  Rotina 2: conversão entre os sistemas hexadecimal, octal e binário para decimal. Agora, a rotina de conversão trabalha com números em formato de string.
function potencia(num, n : integer) : longint;
begin
  potencia := 1;

  while (n > 0) do
  begin
    potencia := potencia * num;
    n := n - 1;
  end;
end;

function num_hex_para_dec(c : char) : integer;
var cod_char : integer;
begin
  cod_char := ord(c);

  case cod_char of
    48..57 : num_hex_para_dec := cod_char - 48;
    65..70 : num_hex_para_dec := cod_char - 55;
    97..102 : num_hex_para_dec := cod_char - 87;
  else
   num_hex_para_dec := 0;
  end;
end;

function sistema_para_decimal(num_str : string; base : integer) : integer;
var i, num, num_str_size : integer;
begin
  sistema_para_decimal := 0;
  num_str_size := length(num_str);

  for i:=num_str_size downto 1 do
  begin
    num := num_hex_para_dec(num_str[i]);
    sistema_para_decimal := sistema_para_decimal + potencia(base, num_str_size - i) * num;
    num := num div 10;
  end;
end;

function num_para_string(num : longint) : string;
begin
  num_para_string := '';

  while num > 0 do
  begin
    num_para_string := chr((num mod 10) + 48) + num_para_string;
    num := num div 10;
  end;
end;

function bin2dec(num : longint) : integer;
begin
  bin2dec := sistema_para_decimal(num_para_string(num), 2);
end;

function oct2dec(num : longint) : integer;
begin
  oct2dec := sistema_para_decimal(num_para_string(num), 8);
end;

function hex2dec(num : string) : integer;
begin
  hex2dec := sistema_para_decimal(num, 16);
end;

begin
  writeln('Hexadecimal 2B para decimal: ', hex2dec('2B'));
  writeln('Octal 20 para decimal: ', oct2dec(20));
  writeln('Binario 1100 para decimal: ', bin2dec(1100));
end.
Saída:
Hexadecimal 2B para decimal: 43
Octal 20 para decimal: 16
Binario 1100 para decimal: 12

  Rotina 3: converte um número decimal para qualquer sistema até hexadecimal.
function dec_para_num_hex(num : integer) : char;
begin
  case num of
    0..9 : dec_para_num_hex := chr(num + 48);
    10..15 : dec_para_num_hex := chr(num + 55);
  else
   dec_para_num_hex := chr(0);
  end;
end;

function decimal_para_sistema(num, base : integer) : string;
begin
  decimal_para_sistema := '';

  while num > 0 do
  begin
    decimal_para_sistema := dec_para_num_hex(num mod base) + decimal_para_sistema;
    num := num div base;
  end;
end;

begin
  writeln('Decimal 43 para hexadecimal: ', decimal_para_sistema(43, 16));
  writeln('Decimal 15 para binario: ', decimal_para_sistema(15, 2));
end.
Saída:
Decimal 43 para hexadecimal: 2B
Decimal 15 para binario: 1111


/MARMSX/CURSOS/PASCAL