C语言问题:编写一个带参数的宏,判断一个数是否在下面数列中
一道面试题:编写一个带参数的宏,判断一个数是否在下面数列中:1248163264128...给我的提示是:#defineS(x)...后面...具体需要我写出来;有高手知...
一道面试题:编写一个带参数的宏,判断一个数是否在下面数列中:1 2 4 8 16 32 64 128...
给我的提示是:#define S(x) ...
后面...具体需要我写出来;有高手知道吗?
写出来,再给分。 展开
给我的提示是:#define S(x) ...
后面...具体需要我写出来;有高手知道吗?
写出来,再给分。 展开
5个回答
展开全部
#define S(x) ( !( (x) ^ ( (x) & (-x) ) ) )
解释:通过观察可以看出这个数列中的所有数都是2的n次方,即存储时在内存中表示为所有的二进制位中只有一位为1,其他位均为0。这样可以利用位运算的性质进行验证。由于一个数按位异或自己为0,因此如果一个数在数列中即仅含有一个1,则这个数按位异或自己的lowbit肯定为0。即x^lowbit(x)肯定为0。一个数的lowbit就是这个数按位与这个数的相反数,即取这个数的最低位1所表示的数。
验证程序:输入一个数,判断是否在数列中,在打印True,不在打印False
#include<stdio.h>
#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,就不会满足这条规律
1表示在数列中,0表示不在数列中
如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
//取反加1后与原数相与还是等于原来的那个数就说明是2的n次幂
#define S(n) ( ((n & ((~n) + 1))) ==n )
int main()
{
int i;
while (1)
{
scanf("%d",&i);
if(S(i))
printf("%d,Yes\n",i);
else
printf("%d,No\n",i);
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#define S(x) ((x&(x-1))?0:1)
其中1为在数列中,0为不在数列上
(数列都是2的n次幂)
其中1为在数列中,0为不在数列上
(数列都是2的n次幂)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接调用库函数
追问
老兄 你看清问题了吗 是写宏。不是写函数啊。
追答
(1<<n),这就是答案
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询