mais olha pra vc ver como tah enunciado do exercicio!!
Escreva uma pequena função em java,isTwoPower, que receba um int I e retorne TRUE se somente se i for potência de 2. A função, entretanto, não pode usar divisões ou multiplicações.
Para saber se um número é uma potência de 2, você precisa de fazer uma de duas coisas:
Se o número for inteiro (como 2097152 que é 2 elevado a 21), você pode ir dividindo o número por 2 até chegar ao número 1, e ver se ele deixa resto em alguma das divisões. Se deixar algum resto, então não é uma potência de 2.
2097152 / 2 = 1048576, resto = 0
1048576 / 2 = 524288, resto = 0
…
4 / 2 = 2, resto = 0
2 / 2 = 1, resto = 0
O resto pode ser obtido com o operador % e o resultado da divisão acho que você deve saber como obter.
Se o número for um double, calcule o logaritmo em base 2 do número, e veja se ele é um valor inteiro. Por exemplo, log 2097152 na base 2 é Math.log (2097152) / Math.log (2) = 21. Para saber se um número é inteiro, veja se ele, arredondado para o valor inteiro mais próximo (Math.rint), não excede um determinado limiar (por exemplo, 1E-9).
[quote=pmlm]Sou eu que não estou a perceber o problema ou esse algoritmo não resolve nem de perto o problema dele?
As potências de 2 são: 2,4,8,16,32,64,128,…
Dessas nem2 nem 8 nem 32 nem 128 têm raízes inteiras, muito menos são números pares.[/quote]
Pois é, eu tinha confundido “potência de 2” com “quadrado”. Eu editei a resposta, mas provavelmente isso não deu muito certo.
Obviamente determinar se um número é potência de 2 é bem diferente de determinar se um número é um quadrado.