对于给定的整数,返回下一个最接近的2的幂

asc*_*ftw 2 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;
            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;
}                
Run Code Online (Sandbox Code Playgroud)

虽然上面的效果很好但是你可以看到它不是一个非常优雅的解决方案,并且有其局限性.只是想知道是否有内置的PHP函数或更好的方法.

谢谢.

DAR*_*UCK 7

试试这个 :

pow(2,ceil(log($number,2)))
Run Code Online (Sandbox Code Playgroud)

更有效的一个:

function next_pow($number)
{
    if($number < 2) return 1;
    for($i = 0 ; $number > 1 ; $i++)
    {
        $number = $number >> 1;
    }
    return 1<<($i+1);
}
Run Code Online (Sandbox Code Playgroud)