#define S(x) ( !( (x) ^ ( (x) & (-x) ) ) )
解释:通过观察可以看出这个数列中的所有数都是2的n次方,即存储时在内存中表示为所有的二进制位中只有一位为1,其他位均为0。这样可以利用位运算的性质进行验证。由于一个数按位异或自己为0,因此如果一个数在数列中即仅含有一个1,则这个数按位异或自己的lowbit肯定为0。即x^lowbit(x)肯定为0。一个数的lowbit就是这个数按位与这个数的相反数,即取这个数的最低位1所表示的数。
验证程序:输入一个数,判断是否在数列中,在打印True,不在打印False
#include
#define S(x) ( !( (x) ^ ( (x) & (-x) ) ) )
int main()
{
int x;
while ( ~ scanf("%d", &x) )
{
printf("%s\n", (S(x))?"True":"False");
}
return 0;
}
#define S(x) (((x)&((x)-1) == 0)?1:0)
1表示在数列中,0表示不在数列中
如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律