如何判断:
如果 num 是 2^n (n是自然数) ,那么 num 可以不断的整除 2,直到 num = 1;
16;16/2=8;8/2=4;4/2=2;2/2=1;
24;24/2=12;12/2=6;6/2=3;3/2 不整除
#include <stdio.h>
#include <stdbool.h>
bool is_power_two(int n)
{
if (n <= 0){
return false;
}
while (n % 2 == 0){
n = n / 2;
}
if (n == 1){
return true;
} else {
return false;
}
}
int main(void)
{
printf("%d\n", is_power_two(1)); // 1
printf("%d\n", is_power_two(2)); // 1
printf("%d\n", is_power_two(3)); // 2
return 0;
}
更高效的方法:
2^n 转换为 2 进制:
1 : 1
2 : 10
4 : 100
8 : 1000
16 : 10000
可以看出 2^n 都是 一个 1 后面接 n 个 0 ;
如果用 8 (1000)减去 1,会得到 7,也就是二进制的 0111;
那么 8 & 7; 1000 & 0111;会得到什么情况?
没错 就是 0;
根据以上 我们可以得出,如果 n 是 2 的指数倍 那么:n & (n - 1) = 0;
#include <stdio.h>
#include <stdbool.h>
bool is_power_two(int n)
{
if (n < 1){
return false;
} else {
return n & (n-1)?false:true;
}
}
int main(void)
{
printf("%d\n", is_power_two(1));
printf("%d\n", is_power_two(2));
printf("%d\n", is_power_two(3));
return 0;
}
发表评论 取消回复