• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Furriel

Binário ---> Decimal

11 mensagens neste tópico

Olá a todos,

Estou a tentar passar um número Binário para Decimal.

O que eu estou a tentar fazer é pegar no número binário, fazer um substring de cada bit depois passar para inteiro e depois multiplicar pelo 2^(posição onde estiver).

Comecei a fazer assim mas cheguei à conclusão que dá muito trabalho de escrita pois tenho que fazer isto 32 vezes, ficaria com cerca de 150 linhas de código só para isto.

Alguém sabe de algum método que dê para passar de uma forma mais rápida de Binário para Decimal?

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Épa fazes com cada pergunta ;)...

String binario;//obter o valor pretendido por parametro ou outra coisa qualquer...
int tamanhoString = binario.length(); //apenas para nao invocar o metodo dentro do ciclo.
int decimal = 0;
int resultado = 0;
char valor;

for (int z = 0; z < tamanhoString; z++)
  {
   valor = binario.charAt(tamanhoString - 1 - z);
   decimal = Integer.parseInt(String.valueOf(valor));
   resultado += decimal * Math.pow(2, z);
}

penso que assim funcionará, é um algoritmo muito standard mas penso que serve.... não contempla a criação de substrings....

Mas só por curiosidade qual é que é o input do teu programa? Porque é que estás a converter de binário para decimal? Ou melhor porque é que tens como número inicial a representação binária e não a decimal? Fiz isto para strings porque pensei que quando falaste em ter número em binário te referias a ter a representação binária de um número numa String, enganei-me?

Não sei se é mais rápido ou se está diferente do que tens mas não conheço outra forma.

EDIT:

Reparei agora que fazes uma substring de cada bit, podes fazer apenas de cada octeto, nesse caso de 3 bits e fornecer esses 3 bits ao algoritmo que te indiquei acima, apesar de ser +/- a mesma coisa.

Peace.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas só por curiosidade qual é que é o input do teu programa? Porque é que estás a converter de binário para decimal? Ou melhor porque é que tens como número inicial a representação binária e não a decimal? Fiz isto para strings porque pensei que quando falaste em ter número em binário te referias a ter a representação binária de um número numa String, enganei-me?

Não te enganaste, tenho a Máscara em Binário.

Isto porque no interface o utilizador tem que introduzir a Máscara em valor decimal entre 1 e 32. Exemplo: 195.156.87.98/20

Pego no 20 e passo para binário:11111111.11111111.11110000.00000000

Passo para decimal e já posso fazer o AND lógico entre o IP e a Máscara.

Ainda não testei o teu código mas parece funcionar ;)

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Explica-me lá outra vez porque raio é que passas o valor para binário? Se recebes o valor em decimal podias usa-lo logo...

        String input = "195.156.87.98/20"; // obtido por parametro ou outra coisa qualquer.
        
        /*A "\" é um caracter especial de Strings e de expressoes regulares, 
            se nao me engano sao mesmo precisas as 4 barras. 
         */
        String[] firstParse = input.split("\\\\");
        
        /* Novamente o ponto e' um caracter especial para expressoes regulares
            e tem de ser precedido de uma "\" para ser considerado um caracter normal.*/
        String[] ipParse = firstParse[0].split("\\.");
        int[] decimal = new int[4];//vector que ira' conter os decimais
        
        for(int z = 0; z < ipParse.length(); z++) { // tambem se pode usar 3 directamente uma vez que um IP tem sempre 4 octetos.
            decimal[z] = Integer.parseInt(ipParse[z]);// tens agora um vector com os 4 octetos em decimal         
        }
        
        //AND logico, com reutilizacao de variavel
        decimal[0] = decimal[0] & 255;//hardcoded pelo exemplo que deste
        decimal[1] = decimal[1] & 255;
        decimal[1] = decimal[2] & 255;
        decimal[1] = decimal[3] & Integer.parseInt(firstParse[1]);// se nao te esueceste na segunda posicao do vector estava a MASK        
    }

Não testei o código e isto de programar em caixas de resposta a tópicos não é muito fácil mas penso que este simples código faz parte do que queres, no fim acabas com o valor da comparação no vector 'decimal', daí podes usá-lo onde quiseres.

Acho que não pensaste bem no que estavas a fazer, até porque se leres o que escreveste, tu afirmas que passas de decimal para binário e de binário para decimal, ora acho que isso é voltar ao início ;)

Não sei se conheces a função 'split' da String mas a única coisa que a função faz é dividir uma String pela expressão regular que se passa por parâmetro, o problema é que a "\" é especial para a String e para as expressões regulares, bem como o "." que é expecial para a expressão regular, por isso é que parece um pouco estranho. Não sei se conheces expressões regulares mas pelo sim pelo não fica a leve explicação ;)

Peace.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente pode ser um pouco confuso mas tenho que passar de decimal para binário e depois deste binário para o decimal final.

Isto porque o 1º Decimal é um número entre 1 e 32 enquanto que o 2º Decimal tem que estar na forma 255.255.240.0

Se for:

195.156.87.98/20 a Máscara vai ser 255.255.240.0

195.156.87.98/18 a Máscara vai ser 255.255.192.0

195.156.87.98/22 a Máscara vai ser 255.255.252.0

tudo depende do número de 1's que vais ter.

Por isso passo para binário dependendo do número de uns que tenho, no caso de ser 20 fica: 11111111.11111111.11110000.00000000

E só agora é que sei se vai ser o máximo (255) ou outro valor. Neste caso o 3º octeto é 11110000=240

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já testei o teu primeiro código e funciona às mil maravilhas ;)

Não conhecia aquela formula matemática.

Obrigado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok,percebi o objectivo, não estava mesmo a ver porque raio é que andavas às voltas a fazer conversões ;)

Ainda bem que te ajudou, qualquer coisa dispõe.

Peace.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Afinal existe uma maneira mais simples de passar de binario para decimal:

valueOf(String s, int radix)

    Returns an Integer object holding the value extracted from the specified String when parsed with the radix given by the second argument.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:) Como vês a API do Java é enorme :P

É verdade ;)

Andei a ver aqui e ali e descobri isso :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica aqui outra solução para além da do Knitter

        String[] octetos = host.split("\\."); //host é uma variável String que contém o IP em binário

                                                            //ex.: 01110101.10011000.00111101.00001111

        int i, x;

        String fim="";

     

        for(i=0;i<octetos.length;i++){

            x=Integer.valueOf(octetos, 2);

            fim = fim + x;

            fim = fim + ".";

        }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora