2014-01-11 39 views
2

我想寫一個函數,它將返回下一個2的冪。所以如果輸入是18,它將返回32,這是系列2中大於18的下一個數字,4,8,16,32,64返回給定整數的下一個最接近的2的冪

如果輸入爲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

循環連續的兩次冪,直到你得到大於'$ number'的東西 –

+1

1是2的冪。 –

回答

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

不工作。如果輸入是18,則返回25。 – user1309690

+0

我很抱歉,我顛倒了論據 –

+0

謝謝。現在完美的工作! – user1309690

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 
0

這非常適用: php > echo pow(2, (strlen(decbin(9)))); 16

將數字轉換爲十進制數,然後將2增加到字符數的冪。

相關問題