Reputation: 3476
I want to write a function that will return next power of 2. So if input is 18 it will return 32 which is the next number greater than 18 in the series 2, 4, 8, 16, 32, 64
If input is 40 it will return 64.
Currently I am using the following function:
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;
}
Although the above works well but as you can see it is not a very elegant solution and has its limitation. Just wondering if there is a in-built PHP function or some better way of doing it.
Thanks.
Upvotes: 2
Views: 1866
Reputation: 95
This works well:
php > echo pow(2, (strlen(decbin(9))));
16
Convert the number to decimal, and raise 2 to the power of the number of chars.
Upvotes: 1
Reputation:
The following code should work:
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
Upvotes: 1
Reputation: 1777
Try this :
pow(2,ceil(log($number,2)))
A more effective one :
function next_pow($number)
{
if($number < 2) return 1;
for($i = 0 ; $number > 1 ; $i++)
{
$number = $number >> 1;
}
return 1<<($i+1);
}
Upvotes: 8