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

19
php
demandé sur Kartik 2011-02-11 06:21:38

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.

42
répondu dan04 2011-02-11 03:25:49

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é...)

8
répondu Ned Batchelder 2011-02-11 03:25:56

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
}
3
répondu ircmaxell 2011-02-11 03:26:34

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.

2
répondu Artefacto 2011-02-11 03:50:19

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";
    }
?>
0
répondu Stranger 2016-07-14 08:29:19
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))
-2
répondu Brent 2011-03-07 21:47:16