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

时间:2014-01-11 09:53:16

标签: 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;
}                

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

感谢。

3 个答案:

答案 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增加到字符数的幂。