查找数字是否为2的幂

时间:2011-02-11 03:21:39

标签: php

出于好奇,如何在不使用递归的情况下判断数x是2的幂(x = 2 ^ n)。

由于

7 个答案:

答案 0 :(得分:43)

一种方法是使用按位AND。如果数字$x是2的幂(例如,8 = 1000),则它与其前任(7 = 0111)没有共同的位。所以你可以写:

($x & ($x - 1)) == 0

注意:这会对$ x == 0给出误报。

答案 1 :(得分:8)

从数字中减去1,然后用原始数字减去它。如果结果为零,则为2的幂。

if (((n-1) & n) == 0) {
    // power of two!
}

(抱歉,我的PHP生锈了......)

答案 2 :(得分:3)

如果是2的幂?好吧,一种方法是将其转换为二进制,并验证仅存在1 1 ...:

$bin = decbin($number);
if (preg_match('/^0*10*$/', $bin)) {
    //Even Power Of 2
}

答案 3 :(得分:2)

为了完整性,如果数字是浮点数,你可以通过查看尾数是否全为零来测试它是否为2的幂:

<?php
$number = 1.2379400392853803e27;
$d = unpack("h*", pack("d", $number)); $d = reset($d);
$isPowerOfTwo = substr($d, 0, 13) == "0000000000000";
var_dump($isPowerOfTwo); // bool(true)

为读者练习:角落案件和大端机器。

答案 4 :(得分:1)

在任意十进制数的二进制等价值中,2的幂将在其二进制等价物中只出现一次1。

<?php
    $number = 4096;
    $bin = decbin($number);
    if ($number != 1 && substr_count($bin,1) == 1) {
        echo "Yes";
    } else {
        echo "No";
    }
?>

答案 5 :(得分:0)

最佳答案:

($x & ($x - 1)) == 0

似乎对我来说有更大的数字问题,这对于使用相同逻辑但具有GMP的更大数字非常有效:

gmp_strval(gmp_and($x, gmp_sub($x, 1))) == 0

答案 6 :(得分:-2)

Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))