Dado un entero positivo, escribe una función para encontrar si es una potencia de dos o no.
Ejemplos:
Input : n = 4 Output : Yes 22 = 4 Input : n = 7 Output : No Input : n = 32 Output : Yes 25 = 32
1. Un método simple para esto es simplemente tomar el logaritmo del número en base 2 y si obtienes un número entero, entonces el número es potencia de 2.
Java
// Java Program to find whether a // no is power of two class GFG { /* Function to check if x is power of 2*/ static boolean isPowerOfTwo(int n) { return (int)(Math.ceil((Math.log(n) / Math.log(2)))) == (int)(Math.floor(((Math.log(n) / Math.log(2))))); } // Driver Code public static void main(String[] args) { if (isPowerOfTwo(31)) System.out.println("Yes"); else System.out.println("No"); if (isPowerOfTwo(64)) System.out.println("Yes"); else System.out.println("No"); } } // This code is contributed by mits
No Yes
Complejidad del tiempo: O(log 2 n)
Espacio Auxiliar: O(1)
2. Otra solución es seguir dividiendo el número por dos, es decir, hacer n = n/2 iterativamente. En cualquier iteración, si n%2 se vuelve distinto de cero y n no es 1, entonces n no es una potencia de 2. Si n se convierte en 1, entonces es una potencia de 2.
Java
// Java program to find whether // a no is power of two import java.io.*; class GFG { // Function to check if // x is power of 2 static boolean isPowerOfTwo(int n) { if (n == 0) return false; while (n != 1) { if (n % 2 != 0) return false; n = n / 2; } return true; } // Driver program public static void main(String args[]) { if (isPowerOfTwo(31)) System.out.println("Yes"); else System.out.println("No"); if (isPowerOfTwo(64)) System.out.println("Yes"); else System.out.println("No"); } } // This code is contributed by Nikita tiwari.
No Yes
3. Todas las potencias de dos números tienen solo un conjunto de bits. Así que cuenta el no. de bits establecidos y si obtiene 1, entonces el número es una potencia de 2. Consulte Contar bits establecidos en un número entero para contar bits establecidos.
4. Si restamos una potencia de 2 números por 1, todos los bits no establecidos después del único bit establecido se establecerán; y el bit establecido se desactiva.
Por ejemplo, para 4 (100) y 16 (10000), obtenemos lo siguiente después de restar 1
3 -> 011
15 -> 01111
Entonces, si un número n es una potencia de 2, bit a bit & de n y n-1 será cero . Podemos decir que n es una potencia de 2 o no según el valor de n&(n-1). La expresión n&(n-1) no funcionará cuando n sea 0. Para manejar este caso también, nuestra expresión se convertirá en n& (!n&(n-1)) (gracias ahttps://www.geeksforgeeks.org/program-to-find-whether-a-no-is-power-of-two/ Mohammad por agregar este caso).
A continuación se muestra la implementación de este método.
Java
// Java program to efficiently // check for power for 2 class Test { /* Method to check if x is power of 2*/ static boolean isPowerOfTwo(int x) { /* First x in the below expression is for the case when x is 0 */ return x != 0 && ((x & (x - 1)) == 0); } // Driver method public static void main(String[] args) { System.out.println(isPowerOfTwo(31) ? "Yes" : "No"); System.out.println(isPowerOfTwo(64) ? "Yes" : "No"); } } // This program is contributed by Gaurav Miglani
No Yes
¡ Consulte el artículo completo sobre el programa para averiguar si un no es potencia de dos para obtener más detalles!
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA