首先我们知道整数在计算机中是以二进制补码的形式存储的,而正整数的补码就是它的二进制原码本身。所以我们可以在这个层面上对数字进行运算。
再来看几个十进制数的二进制模式(8位):
2 :0000 0010
4 :0000 0100
8 :0000 1000
我们发现,2的非负整数次幂的二进制所有位中都只有一个1。
接下来介绍按位与运算符 :“&”
按位与运算符功能是将两个数对应的各位相与。而每一位上不是1就是0。
1 & 1 = 1
1 & 0 = 0
0 & 0 = 0
0 & 1 = 0
简单来说,就是 & 两边的数字至少有1个0时,结果就为0。
而 1 :0000 0001
3 :0000 0011
5 :0000 0101
所以,2 & 1 = 0
4 & 3 =0
接下来展示代码:
/*不使用循环和递归判断一个数是否为2的非负整数次幂*/
#include<stdio.h>
int main(void)
{
int number;
printf("请输入您想判断的数字:");
scanf("%d",&number);
if ((number>0) && (number & (number-1))==0)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
return 0;
}