php - sacar - Averiguar si un número es una potencia de 2.
sqrt php (6)
En un equivalente binario de cualquier número decimal que sea una potencia de dos, solo tendrá una aparición de 1 en su equivalente binario.
<?php
$number = 4096;
$bin = decbin($number);
if ($number != 1 && substr_count($bin,1) == 1) {
echo "Yes";
} else {
echo "No";
}
?>
Solo por curiosidad, ¿cómo puedes saber si un número x es una potencia de dos (x = 2 ^ n) sin usar la recursión?
Gracias
Para completar, si el número es un flotador, puedes probar si es una potencia de dos chacking si la mantisa es todo ceros:
<?php
$number = 1.2379400392853803e27;
$d = unpack("h*", pack("d", $number)); $d = reset($d);
$isPowerOfTwo = substr($d, 0, 13) == "0000000000000";
var_dump($isPowerOfTwo); // bool(true)
Ejercicio para el lector: esquineros y máquinas big-endian.
Resta 1 del número, y luego con el número original. Si el resultado es cero, era una potencia de dos.
if (((n-1) & n) == 0) {
// power of two!
}
(Lo siento, mi PHP está oxidado ...)
Si es un poder de 2? Bueno, una forma es convertirlo en binario y verificar la presencia de solo 1 1
...:
$bin = decbin($number);
if (preg_match(''/^0*10*$/'', $bin)) {
//Even Power Of 2
}
Una forma es usar bitwise AND. Si un número $x
es una potencia de dos (por ejemplo, 8 = 1000), no tendrá bits en común con su predecesor (7 = 0111). Así que puedes escribir:
($x & ($x - 1)) == 0
Nota: Esto dará un falso positivo para $ x == 0.
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))