利用位与 & 运算,判断一个整数是否是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版权协议,转载请附上原文出处链接和本声明。