c语言中使用位与&运算判断一个整数是否是2的n次幂

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

分析过程:
二进制数的位权是2的n次方,通过观察发现如果一个数m是2的n(n>=0 )次方,那么它的二进制数的最高位必定为1,其余位都是0;
比如2 -->10 2^2 -->100 2^3 -->1000 2^4 -->10000 这是一些符合要求的m值对应的二进制数
m-1:1 -->01 3 -->011 7 -->0111 15 -->01111 这是一些m-1的值 对应的二进制数
m&(m-1): 00 000 0000 00000 满足条件的m,m&(m-1) ==0;得出结论:如果一个整数m是2的n次方,那么m&(m-1)一定为0;即使m=1也是满
足的
不符合的m: 3 -->011 7 -->0111 15 -->01111 这是一些整数不是2的n次幂 对应的二进制数
减1: 2 -->010 6 -->0110 14 -->01110 这是不满足条件的整数减去1之后对应的二进制数
m&(m-1): 010 0110 01110 不满足条件的m,m&(m-1) !=0;得出结论:如果一个整数m不是2的n次方,那么m&(m-1)一定不为0

#include <stdio.h>
/*
二进制数的位权是2的n次方,通过观察发现如果一个数m是2的n(n>=0 )次方,那么它的二进制数的最高位必定为1,其余位都是0;
比如2 -->10 2^2 -->100 2^3 -->1000 2^4 -->10000 这是一些符合要求的m值对应的二进制数
m-1:1 -->01 3   -->011 7   -->0111 15  -->01111 这是一些m-1的值 对应的二进制数
m&(m-1): 00        000        0000        00000 满足条件的m,m&(m-1) ==0;得出结论:如果一个整数m是2的n次方,那么m&(m-1)一定为0;即使m=1也是满
足的
不符合的m:  3   -->011 7   -->0111 15  -->01111 这是一些整数不是2的n次幂 对应的二进制数
减1:        2   -->010 6   -->0110 14  -->01110 这是不满足条件的整数减去1之后对应的二进制数
m&(m-1):          010        0110        01110 不满足条件的m,m&(m-1) !=0;得出结论:如果一个整数m不是2的n次方,那么m&(m-1)一定不为0

*/
int main()

{
int result;
printf("请输入一个整数");
int m;
scanf("%d",&m);//不可写成scanf("%d\n",&m);否则用户输入之后马上换行,m获取不到值,程序无法继续下去
result = func(m);
printf("result为1表示该整数是2的n次幂,现在result=%d",result);
return 0;
}
int func(int num) //形参是要判断的整数
{//整数必须大于0 然后整数位与运算整数-1必须为0
    return ((num > 0) && ((num & (num - 1)) == 0));//如果两个条件都满足则返回1 表示整数是2的n次方 如果有一个条件不满足则返回0 表示整数不是2>的n次方
}

当然如果是java代码只需将printf改为println即可;
主要是结合了二进制的位权是2的n次方以及位与运算的特点发现规律;


版权声明:本文为qq_37335168原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。