Conversão de valor decimal para binário [parte 1]

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”.

ValorParte inteira
da divisão
Resto
da divisão
PosiçãoPeso no valor total
21%210101*100 = 1
10%25010*101 = 0
5%22121*102 = 100
2%21030*103 = 0
1%20141*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 =)

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.