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

一道面试题:编写一个带参数的宏,判断一个数是否在下面数列中:1248163264128...给我的提示是:#defineS(x)...后面...具体需要我写出来;有高手知... 一道面试题:编写一个带参数的宏,判断一个数是否在下面数列中:1 2 4 8 16 32 64 128...
给我的提示是:#define S(x) ...
后面...具体需要我写出来;有高手知道吗?
写出来,再给分。
展开
 我来答
1242385643
2014-09-07 · 超过36用户采纳过TA的回答
知道答主
回答量:80
采纳率:0%
帮助的人:61.7万
展开全部
#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;
}
菜鸟笔记fIpOr
2014-09-07 · TA获得超过150个赞
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:179万
展开全部
#define S(x) (((x)&((x)-1) == 0)?1:0)

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

如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
懒得理你ing
2014-09-07 · 超过13用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:27.8万
展开全部
#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dgxjtuzjc
2014-09-07 · TA获得超过2655个赞
知道大有可为答主
回答量:1597
采纳率:66%
帮助的人:966万
展开全部
#define S(x) ((x&(x-1))?0:1)
其中1为在数列中,0为不在数列上
(数列都是2的n次幂)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangcheng74520
2014-09-07
知道答主
回答量:72
采纳率:0%
帮助的人:21.9万
展开全部
直接调用库函数
追问
老兄 你看清问题了吗 是写宏。不是写函数啊。
追答
(1<<n),这就是答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式