目录

利用位与 & 运算,判断一个整数是否是2的整数次幂


二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果,例如:

1
2
3
2 --> 0000 0010        1 --> 0000 0001        2&1 --> 0000 0010 & 0000 0001 = 0
4 --> 0000 0100        3 --> 0000 0011        4&3 --> 0000 0100 & 0000 0011 = 0
8 --> 0000 1000        7 --> 0000 0111        8&7 --> 0000 1000 & 0000 0111 = 0

可以看出所有的 1 完美的错过了,根据位与的特点可知 m&(m-1) 的结果为 0。

如果整数 m 不是 2 的 n 次幂,结果会怎样呢?例如 m=9 时:

1
9 --> 0000 1001        8 --> 0000 1000        9&8 --> 0000 1001 & 0000 1000 != 0

利用这一特点,即可判断一个整数是否是2的整数次幂。

1
2
3
4
int func(int num)
{
    return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0
}

返回值为 1,则输入的正整数为 2 的整数次幂,返回值为 0 则不是。

对于 2 的幂指数的详细程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int num;
int func(int num)
{
    if ((num>0)&&(num&(num-1))==0)
    {
        printf("%d是2的整数次幂",num);
    }
    else
    {
        printf("%d不是2的整数次幂",num);
    }
    return((num>0)&&(num&(num-1))==0);
}

int main()
{
    printf("请输入要查询的数\n");
    scanf("%d",&num);
    func(num);
}

注意:c语言不能对浮点型进行位运算。 位运算 只能 用于 整型。


参考资料

程序设计入门–C翁恺

c语言程序设计》–谭浩强

《C Primer Plus》–Stephen Prata

C语言中文网

C语言教程|菜鸟教程