Recursividade para converter Binário para Decimal

1. Recursividade para converter Binário para Decimal

Edilson Alzemand Sigmaringa Junior
Alzemand

(usa Ubuntu)

Enviado em 25/03/2016 - 19:55h

E ai galera

Fiz um código que converte binário para decimal, porém preciso que a função "bin_to_dec" seja uma função recursiva. Como faço ?

#include <stdio.h>

int bin_to_dec(int bin)
{
int total = 0;
int potenc = 1;

while(bin > 0) {
total += bin % 10 * potenc;
bin = bin / 10;
potenc = potenc * 2;

fprintf(stderr, "while\n");
}

return total;
}

int main(void)
{
int dec = 0;
int bin = 0;

printf("Entre com um inteiro (0's e 1's): ");
scanf("%d", &bin);

dec = bin_to_dec(bin);

printf("Bin = %d - Dec = %d\n", bin, dec);
}



  


2. Re: Recursividade para converter Binário para Decimal

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/03/2016 - 01:43h

Normalmente, quando se pede conversão de binário para decimal ou vice-versa, o número binário costuma ser representado como string. Veja que, numa máquina com inteiros de 32 bits, você precisaria de 32 dígitos binários para representar todos os possíveis valores inteiros. No entanto, com a notação que você empregou, você só consegue representar dez bits.

Além disso só existirá conversão realmente se a saída também for uma string. Se você converter de string para inteiro, na prática esse inteiro continua com uma representação binária na memória do computador. Nesse sentido, a função que converte de binário para decimal é printf(), quando você usa a conversão "%d".

De todo modo, o que se faz para converter um loop para funo recursiva é reprojetar a função para se comportar como uma iteração do loop, e chamar a si mesma com os dados que seriam usados na próxima iteração.

Por exemplo, veja abaixo duas maneiras de calcular a fatorial de um número, sendo uma delas por laço de repetição e outra por chamada recursiva.

unsigned fat_loop(unsigned n){
unsigned fat=1u;
while(n>1u)
fat*=n--; // Próxima iteração usa n-1 (decrementando n).
return fat;
}

unsigned fat_recurse(unsigned n){
// Próxima iteração usa n-1 via chamada recursiva.
return n>1u? n*fat_recurse(n-1u): 1u;
}



3. Re: Recursividade para converter Binário para Decimal

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/03/2016 - 12:07h

Dê uma olhada neste código: https://www.vivaolinux.com.br/script/Funcao-para-escrita-de-um-numero-em-notacao-binaria-atraves-de-...

Ele faz o contrário do que você quer: de decimal para binário. Há dois truques nele:

* flag (sinalizador), que indica que alguma coisa diferente ocorreu e será feita uma avaliação para uma atitude diferente.
* variável static, que só é visível dentro da função e que não perde o valor quando a função é encerrada.

Veja se ele pode auxiliar em algo.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



4. Re: Recursividade para converter Binário para Decimal

Edilson Alzemand Sigmaringa Junior
Alzemand

(usa Ubuntu)

Enviado em 26/03/2016 - 12:46h

listeiro_037 escreveu:

Dê uma olhada neste código: https://www.vivaolinux.com.br/script/Funcao-para-escrita-de-um-numero-em-notacao-binaria-atraves-de-...

Ele faz o contrário do que você quer: de decimal para binário. Há dois truques nele:

* flag (sinalizador), que indica que alguma coisa diferente ocorreu e será feita uma avaliação para uma atitude diferente.
* variável static, que só é visível dentro da função e que não perde o valor quando a função é encerrada.

Veja se ele pode auxiliar em algo.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Não serve, pois a conversão de binario para decimal é mais difícil que decimal para binário. Seu código não serviu para transformar minha função em recursiva :(



5. Re: Recursividade para converter Binário para Decimal

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/03/2016 - 12:48h

Outra dica:

Parta da esquerda multiplicando por 2 a cada deslocamento e somando 0 ou 1 conforme aparecem 0 ou 1.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



6. Conseguiu?

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 29/03/2016 - 15:04h

Se não, pense assim:

1. Qual a melhor forma de modificar entradas em funções recursivas?
2. Quantas variáveis você precisa para computar um número?
3. Quais os métodos existentes para calcular um número decimal através de um binário?
4. Você pode construir uma cadeia de somas usando recursividade.... (Essa é quente!)
5. Se você tem uma string, qual uma boa forma de usar a string como condição de parada de recursão? (Outra dica boa)
6. Qual operação bitwise desloca bits? (Chega de dicas boas!)

Se responder a essas perguntas, você provavelmente entenderá como implementar sua função.
Implementei uma função com apenas 1 linha no escopo.
A implementação é fácil, o difícil é imaginar a recursão.

Preocupe-se com o processo, depois com o programa, depois com a sintaxe.

[]'s
Enzo Ferber


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.



7. Re: Recursividade para converter Binário para Decimal

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/03/2016 - 15:45h

Faça assim:

Leia o primeiro caractere da string binária.
Se não for o último, multiplique por dois.
Acumule.
Leia o próximo caractere.
Some o valor do caractere.
Se não for o último, multiplique por dois.
...

Faça isto até terminar a string.
Depois pense em como ficará no recursivo.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts