aula 314

Como converter um número decimal em binário e salvar em uma variável?

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;
}

Deixe um comentário

catorze − um =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.