Usar Operação Bitwise para Potência de Dois
Nesta etapa, exploraremos uma maneira inteligente de determinar se um número é uma potência de dois usando operações bitwise em Java. Este método é frequentemente mais eficiente do que as abordagens tradicionais baseadas em loop.
Primeiro, vamos entender o que é uma potência de dois. Uma potência de dois é qualquer número que pode ser expresso como 2 elevado a um expoente inteiro (por exemplo, 2^0 = 1, 2^1 = 2, 2^2 = 4, 2^3 = 8, e assim por diante). Na representação binária, as potências de dois têm um padrão único: são representadas como um 1 seguido por zero ou mais 0s (por exemplo, 1 é 1, 2 é 10, 4 é 100, 8 é 1000).
Agora, considere a representação binária de uma potência de dois e o número imediatamente anterior a ela. Por exemplo:
- 8 em binário é
1000
- 7 em binário é
0111
Se executarmos uma operação bitwise AND (&) entre uma potência de dois e o número imediatamente anterior a ela, o resultado é sempre zero. Isso ocorre porque a potência de dois tem um único bit 1, e o número anterior a ela tem 0s nessa posição e 1s em todas as posições à direita.
Por exemplo, 8 (1000) & 7 (0111) = 0000 (que é 0).
Esta propriedade é válida para todas as potências positivas de dois. Qualquer número positivo que não seja uma potência de dois terá pelo menos dois bits 1 em sua representação binária. Quando você executa um bitwise AND com o número anterior, pelo menos um desses bits 1 se alinhará com um bit 1 no número anterior, resultando em um valor diferente de zero.
Portanto, a condição para que um número positivo n seja uma potência de dois é (n & (n - 1)) == 0.
Vamos criar um programa Java para implementar essa verificação.
-
Abra o arquivo HelloJava.java no editor WebIDE.
-
Substitua o código existente pelo seguinte:
public class HelloJava {
// Function to check if a number is a power of two using bitwise AND
public static boolean isPowerOfTwo(int n) {
// A number is a power of two if it's positive and (n & (n - 1)) is 0
return (n > 0) && ((n & (n - 1)) == 0);
}
public static void main(String[] args) {
int number1 = 8;
int number2 = 12;
int number3 = 1;
System.out.println(number1 + " is a power of two: " + isPowerOfTwo(number1));
System.out.println(number2 + " is a power of two: " + isPowerOfTwo(number2));
System.out.println(number3 + " is a power of two: " + isPowerOfTwo(number3));
}
}
Neste código:
- Definimos um método estático
isPowerOfTwo que recebe um inteiro n como entrada.
- Dentro do método, verificamos se
n é maior que 0 e se o bitwise AND de n e n-1 é igual a 0.
- O método
main demonstra como usar o método isPowerOfTwo com alguns números de exemplo.
-
Salve o arquivo (Ctrl+S ou Cmd+S).
-
Compile o programa Java no Terminal:
javac HelloJava.java
Se não houver erros, a compilação será bem-sucedida.
-
Execute o programa compilado:
java HelloJava
Você deve ver uma saída semelhante a esta:
8 is a power of two: true
12 is a power of two: false
1 is a power of two: true
Esta saída confirma que nossa verificação bitwise identifica corretamente as potências de dois.