Converter binario

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:

(11 + 02 + 14 + 18 ) ou seja (1 + 0 + 4 + 8) totalizando 13.


[code]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;

[/code]


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

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

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:


[code]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;[/code]  

Agora ele ta dando erro na linha 11 na variavel “exp”.
Ta armazenando um valor que nao tem nada a ver.>

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

Entao, para funcionar, altere seu código para

[code]# 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; [/code]

Aqui funcionou blz! :smiley:

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.

[quote=diego_mendis@hotmail.com]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.[/quote]

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

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:

[code] 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;
}[/code]

Espero ter ajudado.
E não se preocupe em apagar o tópico, estamos todos aqui para aprender.

Boa sorte!

Muito legal! Obrigado :stuck_out_tongue: