Nesta aula vamos revisar o processo de conversão de um número decimal em binário e aprender uma forma de salvar o valor em binário em uma variável.
Assim como na aula anterior, há aqui dois problemas. Primeiro precisamos converter um número decimal em binário, depois, pensar uma forma de salvar o valor em binário em alguma variável.
Números no sistema binário são sempre mais extensos que números no sistema decimal. O 100 por exemplo, que possui três dígitos no sistema decimal, possui sete dígitos no sistema binário 1100100. Assim, concluímos que os números binários crescem muito rápido, o que nos leva a crer que não será possível salva-los em uma simples variável inteira.
Dessa forma restam então duas alternativas: salvar cada dígito do número binário em uma posição de um vetor; ou salvar cada dígito do número binário como caracter, formando uma string.
Adotarei aqui a primeira estratégia, salvando cada dígito do número binário em uma posição de um vetor de inteiros.
Não irei entrar em detalhes aqui a respeito do processo de conversão de um número decimal em um número binário uma vez que isso já foi feito na aula 164. Aqui, apenas usaremos o mesmo procedimento desenvolvido na referida aula.
O procedimento de conversão de decimal para binário é um procedimento recursivo. Observe que a impressão do dígito em binário (printf) está após a chamada recursiva, no else. Ou seja, chamadas recursivas são feitas até que a variável n (valor em decimal a ser convertido) atinga o valor zero. Neste momento, as chamadas recursivas começam a ser desempilhadas e, ao finalizar cada chamada, é impresso um dígito do número binário na tela. A última chamada recursiva irá imprimir o primeiro dígito do nosso número binário, o dígito mais à esquerda, enquanto que a primeira chamada feita (última a finalizar), irá imprimir o último dígito de nosso número binário, o número mais à direita.
Precisamos alterar este procedimento para, além de imprimir cada dígito na tela, também salvar em nosso vetor. Como a impressão é feita da esquerda para a direita e não sabemos de antemão quantos dígitos terá nosso número binário, é interessante saber a última posição do vetor e em cada chamada recursiva diminuir uma unidade. Assim, vamos preencher apenas a parte necessário à direita do vetor e as demais posições à esquerda serão preenchidas com zero.
Voltando ao nosso exemplo com o 100 em decimal e um vetor de inteiros, nosso vetor final será algo parecido com isso: 00000000000001100100
Assim como no sistema decimal, zeros à esquerda de qualquer número não vale nada, mas à direita sim, por isso acrescentamos os zeros restantes à esquerda de nosso vetor e não à direita.
/* Converte um número decimal em binário, imprime na tela e salva no vetor vet */ void binario(int n, int *vet, int id){ if(n == 0){ printf("%d", n); vet[id] = n; } else{ binario(n/2, vet, id - 1); printf("%d", n % 2); vet[id] = n % 2; } }
Não função principal criamos um vetor de inteiros com 50 posições. Preenchemos esse vetor com zero para limpar qualquer lixo de memória que possa existir e pedirmos ao usuário que digite o número em decimal que ele deseja converter para binário. Em seguida, chamamos o procedimento que apresentamos acima passando o valor digitado pelo usuário ( n ), o nosso vetor ( vet ) e o último índice válido do vetor, neste caso 49. Por fim, imprimimos todo o vetor na tela.
int main () { int i, n, vet[50]; for(i = 0; i < 50; i++) vet[i] = 0; printf("Digite um valor decimal: "); scanf("%d",&n); binario(n, vet, 49); printf("\n"); for(i = 0; i < 50; i++) printf("%d", vet[i]); printf("\n\n"); return 0; }
Código completo em C para converter um número inteiro em binário e salvar em um vetor
#include <stdio.h> #include <stdlib.h> /* Código escrito por Wagner Gaspar em 26/05/2022 */ void binario(int n, int *vet, int id){ if(n == 0){ printf("%d", n); vet[id] = n; } else{ binario(n/2, vet, id - 1); printf("%d", n % 2); vet[id] = n % 2; } } int main () { int i, n, vet[50]; for(i = 0; i < 50; i++) vet[i] = 0; printf("Digite um valor decimal: "); scanf("%d",&n); binario(n, vet, 49); printf("\n"); for(i = 0; i < 50; i++) printf("%d", vet[i]); printf("\n\n"); return 0; }