我想编写一个函数,它将返回2的下一个幂。因此,如果输入为18,它将返回32,这是系列2,4,8,16,32,64中的下一个大于18的数字
如果输入为40,则返回64。
目前我正在使用以下功能:
switch($number) {
case in_array($number, range(0, 2)):
return 2;
break;
case in_array($number, range(3, 4)):
return 4;
break;
case in_array($number, range(5, 8)):
return 8;
break;
case in_array($number, range(9, 16)):
return 16;
break;
case in_array($number, range(17, 32)):
return 32;
break;
}
虽然上述方法效果很好,但您可以看到它不是一个非常优雅的解决方案,并且有其局限性。只是想知道是否有内置的PHP函数或更好的方法。
感谢。
答案 0 :(得分:6)
试试这个:
pow(2,ceil(log($number,2)))
更有效的一个:
function next_pow($number)
{
if($number < 2) return 1;
for($i = 0 ; $number > 1 ; $i++)
{
$number = $number >> 1;
}
return 1<<($i+1);
}
答案 1 :(得分:0)
以下代码应该有效:
function next_power_of_two($num){
if(is_numeric($num)){
if($num > 1){
return pow(2, ceil(log($num, 2)));
}
else{
return 1;
}
}
return false;
}
$a = next_power_of_two(18); // 32
$b = next_power_of_two("377"); // 512
$c = next_power_of_two(-4); // 1
$d = next_power_of_two("water"); // false
答案 2 :(得分:0)
这很有效:
php > echo pow(2, (strlen(decbin(9))));
16
将数字转换为十进制数,并将2增加到字符数的幂。