判断 num 是不是 2 的指数倍

如何判断:

如果 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容