法一:所判断的数num和num-1相与,若为0,则是2的n次方,否则不是。
8的二进制:1000
8-1=7的二进制:0111
8&7=0000
#include <stdio.h>
int IsTwoIndex1(int num) {
//判断是否为2的n次方,1表示是,0表示不是
return (num & (num - 1)) == 0 ? 1 : 0;
}
int main() {
//判断是否是2的n(n为正数)次方
int n = 0;
printf("请输入要判断的数>");
scanf("%d", &n);
if (IsTwoIndex1(n)) {
printf("%d是2的n次方。\n",n);
}
else {
printf("%d不是2的n次方。\n",n);
}
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/990d437ba7f9ee62cbb03742464a6de9.jpeg)
法二:所判断的数num%2,若为0,表示是2的整数倍,是2的n次方,否则不是2的n次方。追加特殊条件所判断数是否为1,1是2的0次方。
8%2=0
#include <stdio.h>
int IsTwoIndex2(int num) {
//判断是否为2的n次方,1表示是,0表示不是
if (1 == num) {
return 1;
}
else {
return num % 2 == 0 ? 1 : 0;
}
}
int main() {
//判断是否是2的n(n为正数)次方
int n = 0;
printf("请输入要判断的数>");
scanf("%d", &n);
if (IsTwoIndex2(n)) {
printf("%d是2的n次方。\n",n);
}
else {
printf("%d不是2的n次方。\n",n);
}
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/5da45477e03b3ac080961fa61bbda954.jpeg)