Furriel Posted October 16, 2006 at 11:29 PM Report #57966 Posted October 16, 2006 at 11:29 PM 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.
Knitter Posted October 16, 2006 at 11:42 PM Report #57970 Posted October 16, 2006 at 11:42 PM É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.
Furriel Posted October 17, 2006 at 06:51 AM Author Report #57984 Posted October 17, 2006 at 06:51 AM 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.
Knitter Posted October 17, 2006 at 12:47 PM Report #58044 Posted October 17, 2006 at 12:47 PM 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.
Furriel Posted October 17, 2006 at 03:12 PM Author Report #58060 Posted October 17, 2006 at 03:12 PM 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
Furriel Posted October 17, 2006 at 03:19 PM Author Report #58062 Posted October 17, 2006 at 03:19 PM Já testei o teu primeiro código e funciona às mil maravilhas 😉 Não conhecia aquela formula matemática. Obrigado 😉
Knitter Posted October 17, 2006 at 03:29 PM Report #58063 Posted October 17, 2006 at 03:29 PM 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.
Furriel Posted October 18, 2006 at 06:25 PM Author Report #58393 Posted October 18, 2006 at 06:25 PM 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.
Knitter Posted October 18, 2006 at 06:33 PM Report #58395 Posted October 18, 2006 at 06:33 PM 🙂 Como vês a API do Java é enorme 😛
Furriel Posted October 18, 2006 at 06:39 PM Author Report #58396 Posted October 18, 2006 at 06:39 PM 🙂 Como vês a API do Java é enorme 😛 É verdade 😉 Andei a ver aqui e ali e descobri isso 😄
Furriel Posted October 18, 2006 at 08:38 PM Author Report #58435 Posted October 18, 2006 at 08:38 PM 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 + "."; }
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now