Jump to content

Binário ---> Decimal


Furriel

Recommended Posts

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.

Link to comment
Share on other 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.

Link to comment
Share on other 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.

Link to comment
Share on other 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.

Link to comment
Share on other 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

Link to comment
Share on other 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 + ".";

        }

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.