Php 返回给定整数的次最近幂2
我想写一个函数,返回下一个2的幂。因此,如果输入为18,它将返回32,这是序列2、4、8、16、32、64中大于18的下一个数字 如果输入为40,则返回64 目前我正在使用以下功能:Php 返回给定整数的次最近幂2,php,Php,我想写一个函数,返回下一个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;
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函数或更好的方法来实现它
谢谢。试试这个:
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);
}
函数下一个功率($number)
{
如果($number<2)返回1;
对于($i=0;$number>1;$i++)
{
$number=$number>>1;
}
返回1以下代码应该可以工作:
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
这很有效:
php>echopow2,(strlen(decbin(9));
16
将数字转换为十进制,并将2提高为字符数的幂。循环2的连续幂,直到得到大于$number
的值。很抱歉,如果您关心速度,请使用更有效的参数。@SharanyaDutta我更改了名称,在您编写此消息时我正在检查它如果您输入64,请将数字改为128。如果您想简单地返回相同的数字(如果它已经是2的幂),则可以添加$number--;
作为函数的第一行。