Existem várias formas de fazer a conversão entre a base decimal e binária. Inicialmente será apresentada duas formas: a primeira utiliza apenas operações aritméticas “tradicionais”, enquanto a segunda forma utiliza operações bitwise. Outras formas de conversão entre as bases são mostradas em outras postagens, uma vez que utilizam outros recursos de programação, como o uso de vetores e da recursividade de funções (possivelmente as formas mais comuns de realizar a conversão de decimal para binário).
A conversão de um número decimal para um número binário envolve a sucessiva divisão da parte inteira do valor decimal por 2. A cada divisão, o resto da divisão é um dígito binário correspondente à nova base. A maior dificuldade na conversão está no fato de que a posição no valor binário desses restos da divisão são inversos a sua ocorrência na divisão. É importante destacar que a conversão do valor decimal para o binário que será tratada no exercício envolve converter um valor inteiro e positivo. Valores negativos devem levar em consideração outra representação binária para o valor.
O código a seguir é responsável pela conversão do valor decimal para um inteiro. O valor decimal é armazenada na variável dec (o algoritmo poderia ser alterado para converter um valor informado pelo usuário). A solução é uma forma de obter o correspondente binário, mas armazenando como um outro valor inteiro.
O algoritmo considera um “peso” aplicado à cada divisão. O primeiro resto da divisão é o dígito mais a direita do valor (o menor significativo). Cada novo resto de divisão obtido é um dígito mais a esquerda e mais significativo para a composição do valor binário. O quão significativo é o valor é definido pela expressão do dígito, sendo expressa por 10cont, sendo cont a posição do dígito. A tabela a seguir mostra o impacto de cada valor em relação a sua posição. O resultado final é a soma de cada valor obtido no “Peso no valor total”.
Valor | Parte inteira da divisão | Resto da divisão | Posição | Peso no valor total |
21%2 | 10 | 1 | 0 | 1*100 = 1 |
10%2 | 5 | 0 | 1 | 0*101 = 0 |
5%2 | 2 | 1 | 2 | 1*102 = 100 |
2%2 | 1 | 0 | 3 | 0*103 = 0 |
1%2 | 0 | 1 | 4 | 1*104 = 10000 |
#include <stdio.h>
#include <math.h>
int main() {
int cont=0,dec=21, bin=0;
int resto, pot;
while (dec != 0) {
resto = dec % 2; //obtem o resto da divisao
pot = pow(10, cont); //calcula a relevancia do digito
bin += resto * pot; //calcula e acumula a contribuicao do digito no valor
dec /= 2; //pega apenas a parte inteira da divisao
printf("%d*10^%d = %d\n", resto, cont, resto*pot);
cont++;
}
printf("%d", bin);
return 0;
}
O resultado da execução do código é mostrada a seguir. Observe que o resultado da linha 12 é dispensável na conversão, sendo utilizada apenas para depurar as operações a cada passo da estrutura de repetição (o importante é o resultado final, apresentado na última linha).
1*10^0 = 1
0*10^1 = 0
1*10^2 = 100
0*10^3 = 0
1*10^4 = 10000
10101
Diferente da solução gerada pelo código anterior, o algoritmo do próximo código mostra o valor considerando 8 bits. Para uma quantidade n diferente de bits é necessário alterar o valor da inicialização do for, iniciando com o valor n-1. Ou seja, para mostrar 8 bits (n = 8), a variável i do laço for foi inicializada com 7 = 8-1.
Como utiliza operações em bit, o código não é tão simples de entender. É preciso prestar atenção em cada uma das 8 iterações do laço for em relação ao deslocamento de bits a direita (linha 6) e avaliação do teste do desvio condicional (linha 7).
Pegando como exemplo a primeira iteração, cujo valor de i é 7. Como 7 dígitos serão deslocados a direita, o valor 2110 = 000101012 e 000101012 >> 7 = 000000002. Sendo que o valor $110 = 000000012, o operador bitwise & resultará em 1 apenas quando o último bit sendo comparado for também 1. Com isso o resultado do teste na linha 7 é falso (um teste lógico é falso somente quando é resultado um número zero. Com isso, k & 1 != 0 é equivalente à k & 1.
#include <stdio.h>
int main() {
int i, dec = 21;
for (i = 7; i >= 0; i--) {
int k = dec >> i;
if (k & 1) {
printf("1");
} else {
printf("0");
}
}
}
Embora essa seja a parte 1 da conversão de decimal para binário, eu ainda não finalizei a escrita das outras partes, então não adianta procurar =)