Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 返回给定整数的次最近幂2_Php - Fatal编程技术网

Php 返回给定整数的次最近幂2

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;

我想写一个函数,返回下一个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函数或更好的方法来实现它

谢谢。

试试这个:

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--;
作为函数的第一行。