出于好奇,如何在不使用递归的情况下判断数x是2的幂(x = 2 ^ n)。
由于
答案 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))