Savoir si un nombre est une puissance de 2
Juste par curiosité, comment pouvez-vous dire si un nombre x est une puissance de deux (x = 2^n) sans utiliser la récursivité.
Merci
6 réponses
une façon est d'utiliser bitwise et. Si un nombre $x
est une puissance de deux (par exemple, 8=1000), il n'aura pas de bits en commun avec son prédécesseur (7=0111). Vous pouvez donc écrire:
($x & ($x - 1)) == 0
Note: Cela donnera un faux positif pour x $ = 0.
soustrayez 1 du nombre, puis il avec le nombre original. Si le résultat est zéro, c'est une puissance de deux.
if (((n-1) & n) == 0) {
// power of two!
}
(désolé, mon PHP est rouillé...)
si c'est un pouvoir de 2? Eh bien, une façon est de le convertir en binaire, et vérifier la présence de seulement 1 1
...:
$bin = decbin($number);
if (preg_match('/^0*10*$/', $bin)) {
//Even Power Of 2
}
pour être complet, si le nombre est un flotteur, vous pouvez tester si c'est un pouvoir de deux en fracassant si le mantissa est tout zéros:
<?php
$number = 1.2379400392853803e27;
$d = unpack("h*", pack("d", $number)); $d = reset($d);
$isPowerOfTwo = substr($d, 0, 13) == "0000000000000";
var_dump($isPowerOfTwo); // bool(true)
Exercice pour le lecteur: le coin des cas et big-endian machines.
dans un équivalent binaire de n'importe quel nombre décimal qui est une puissance de deux aura seulement une occurrence de 1 dans son équivalent binaire.
<?php
$number = 4096;
$bin = decbin($number);
if ($number != 1 && substr_count($bin,1) == 1) {
echo "Yes";
} else {
echo "No";
}
?>