Converter binario

8 respostas
D

Ae Galera,
preciso de uma ajudinha.
Receber um numero binario inteiro e converte-lo para decimal, utiklizando um laço for.
Ja implementei o codigo, mas ele retorna um numero todo errado.

Exemplo: converter o binario 1011 em decimal:

(1*1 + 0*2 + 1*4 + 1*8 ) ou seja (1 + 0 + 4 + 8) totalizando 13. _____________________________________________________
public double converteDecimal (int x){
		double soma = 0;
		int exp = 0;  //variavel armazena o expoente do numero.
		double r;
		int i;
		double y = 0;
				
		String str = Integer.toString( x ); //converte o numero lido para string
		for(i=0;i<str.length();i++){
			 int c = str.charAt(i); //armazena a string "str" em uma variavel inteira "c"
			 exp = (int) (Math.pow(2,y)); // calcula o expoente.
			 r = c * exp; 
			 soma = soma + r;
			 y++;
		}
		return soma;
________________________________________________________________________

Se alguem puder me ajudar ficarei muito grato.
Abraço!>

8 Respostas

AITech_IX

Olá.

Olha, não sou tão bom assim, mas acho que posso te dar uma luz. Implementando seu código aqui, o erro parece estar aqui

int c = str.charAt(i);

dá um print nela e veja que ela nao captura corretamente apenas um “caractere de sua string”. Aí estraga todo o resto…
Eu não sei te apontar uma solução, mas o problema está aí

abs

D
Fala AITech IX , kra realmente o q vc disse está correto, mas eu ja consertei (troquei o tipo int pra char). Agora ela esta capturando apenas um caractere da string, mas o erro continua. Eis o código corrigido: __________________________________________________________________________
public double converteDecimal (int x){   
        double soma = 0;   
        int exp = 0;  //variavel armazena o expoente do numero.   
        double r;   
        int i;   
        double y = 0;   
                   
        String str = Integer.toString( x ); //converte o numero lido para string   
        for(i=0;i<str.length();i++){   
             char c = str.charAt(i); //armazena a string "str" em uma variavel inteira "c"   
             exp = (int) (Math.pow(2,y)); // calcula o expoente.   
             r = c * exp;   
             soma = soma + r;   
             y++;   
        }   
        return soma;
_______________________________________________________________________ Agora ele ta dando erro na linha 11 na variavel "exp". Ta armazenando um valor que nao tem nada a ver.>
AITech_IX

Fala Diego…
lá vamos nós bater estaca de novo :-ors…

Eu acho que o erro, agora que ele captura a o caracter, é porque onde vc faz

r = c * exp;

o que ele realmente multiplica por exp nao é 1 ou 0 e sim o código em ascii do 1 ou 0 (49 e 48 respectivamente).

AITech_IX

Entao, para funcionar, altere seu código para

# public  double converteDecimal (int x){     
#         double soma = 0;     
#         int exp = 0;  //variavel armazena o expoente do numero.     
#         double r;     
#         int i;     
#         //double y = 0;     
#                      
#         String str = Integer.toString( x ); //converte o numero lido para string     
#         for(i=0;i<str.length();i++){     
#              char c = str.charAt(i); //armazena a string "str" em uma variavel inteira "c"     
#              exp = (int) (Math.pow(2,i)); // calcula o expoente.     
#              r = (c-48 )* exp;     
#              soma = soma + r;     
#              //y++;     retirei pq vc pode usar o proprio i
#         }     
#         return soma;

Aqui funcionou blz! :D

D

Kra,
Vc matou a charada.
Realmente ele tava lendo o nuemro da tabela ascII.
Esse codigo q vc passou funciona mas soh pra binarios ímpares…rsrsrsrs
Se vc joga um par ele nao funfa.
Mas ta facil de resolver agora q ja descobri onde eh o problema.
Valeu cara!

Obs. Sou novo aki, como faço pra apagar esse tópico?
Abraço.

AITech_IX

[email removido:
]Kra,
Vc matou a charada.
Realmente ele tava lendo o nuemro da tabela ascII.
Esse codigo q vc passou funciona mas soh pra binarios ímpares…rsrsrsrs
Se vc joga um par ele nao funfa.
Mas ta facil de resolver agora q ja descobri onde eh o problema.
Valeu cara!

Obs. Sou novo aki, como faço pra apagar esse tópico?
Abraço.

rs… Valeu a tentativa entao!
Eu tb sou novo. Nao sei como apagar…
boa sorte aí entao!
abs

M

Vamos tentar resolver a questão:

1-) Ao executar a instrução
int c = str.charAt(i);
o que será guardado em c é o caracter correspondente ao número que foi selecionado por str.charAt(i). Por isso o "0" vira 48, o "1" vira 49... Foi por isso que o colega fez a conta (c - 48)... para obter o 0 ou 1 em inteiro.

2-) O código tem um pequeno problema de lógica (que faz muita diferença): o for do jeito que está lê o número da esquerda para a direita, por isso 1011 em binário está resultando em 13. O correto é 11. No código abaixo o for lê o número "binário" informado da direita para a esquerda, e portanto fazendo os cálculos corretamente.

3-) Outro detalhe importantíssimo: cuidado ao testar com um número que começa com 0 (zero), por exemplo 0010. O Java vai interpretar esse número como sendo um número em formato octal. Logo ele será convertido para o inteiro 8, pois 010 (o primeiro 0 indica o sistema numérico) em octal corresponde a 8 em decimal. Nesse caso será preciso alterar a implementação do método converteDecimal. Por isso parece que só funciona com números ímpares, pois os ímpares começam com 1, e os pares são convertidos para octal.

Tente o código abaixo:

public int converteDecimal(int x) {
		int soma = 0;
		int exp = 0; // variavel armazena o expoente do numero.
		int r = 0;
		int y = 0;
		Character c;
		
		String str = Integer.toString(x); // converte o numero lido para string

		for (int i = str.length() - 1; i >= 0; i--) {
			
			c = new Character(str.charAt(i));
			String s = c.toString();
			int num = Integer.parseInt(s);
			
			exp = (int) (Math.pow(2, y)); // calcula o expoente.
			r = num * exp;
			soma = soma + r;
			y++;
		}
		return soma;
	}
Espero ter ajudado. E não se preocupe em apagar o tópico, estamos todos aqui para aprender.

Boa sorte!

AITech_IX

Muito legal! Obrigado :stuck_out_tongue:

Criado 3 de abril de 2010
Ultima resposta 3 de abr. de 2010
Respostas 8
Participantes 3