数字在计算机中都是以二进制存储的,所以观察 1 2 4 8等的二进制数
1 00000000 00000000 00000001
2 00000000 00000000 00000010
4 00000000 00000000 00000100
8 00000000 00000000 00001000
然后找规律
例如4 -1=3
3 00000000 00000000 00000011
4 00000000 00000000 00000100
然后3&4看结果是否等于0,要是等于0就说明这个数在这个数列中。
就是(n-1)&n就可以写成 #define X(n) (((n)-1&(n))==0)
这是一种方法,还有另一种方法
例如 可以先对8取8反,然后取反之后加一,再与上8看结果是否等于8本身,要是等于就说明这个数在数列里
8 00000000 00000000 00001000
~8 11111111 11111111 11110111
+1
==========================
11111111 11111111 11111000
8 00000000 00000000 00001000
&
==========================
00000000 00000000 00001000
就可以写为~n+1&n
#define Y(n) ((((~(n))+1)&n) == (n))
#include<stdio.h>
{
#define X(n) ((((n)-1)&(n))==0)
#define Y(n) ((((~(n))+1)&n) == (n))
int main(){
int i;
for(i = 1; i <= 1024; i++){
if(X(i))
printf("%d ", i);
}
printf("\n");
}
}