如何判断:

如果 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;
}


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部