C语言问题:编写一个带参数的宏,判断一个数是否在下面数列中

2024年11月15日 08:49
有2个网友回答
网友(1):

#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;
}

网友(2):

#define S(x) (((x)&((x)-1) == 0)?1:0)

1表示在数列中,0表示不在数列中

如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律