C语言逻辑推理问题...帮忙解释程序

题目:甲、乙、丙、丁四人参加一次数学竞赛。赛后,他们四人预测名次的谈话如下:甲说:“丙得第一,我第三名”;乙说:“我第一名,丁第四名”丙说:“丁第二名,我第三名”丁没说话... 题目:
甲、乙、丙、丁四人参加一次数学竞赛。赛后,他们四人预测名次的谈话如下: 甲说:“丙得第一,我第三名”; 乙说:“我第一名,丁第四名” 丙说:“丁第二名,我第三名” 丁没说话。 当最后结果公布时发现,甲乙丙都只说对了一半,请给出正确的四人名次。

程序:
main() {
short a,b,c,d,j,t;
for (j = 0;j <=15;j++) {
a = (j & 8) >> 3;
b = (j & 4) >> 2;
c = (j & 2) >> 1;
d = j & 1;
t = (b + c + d == 1) + (!b && c) + (a + d == 1) + (!b && c);
if ((t == 2) && (a + b + c + d == 1)) {
printf ("%d,%d,%d,%d\n",a,b,c,d);
}

}
getch ();
}

程序读不懂,求解释
展开
 我来答
百度网友5722492f7
2013-04-30 · TA获得超过725个赞
知道小有建树答主
回答量:594
采纳率:0%
帮助的人:464万
展开全部
main() {
short a,b,c,d,j,t;
for (j = 0;j <=15;j++) { // 16次循环表示2的4次方
a = (j & 8) >> 3; // j和8按位与,然后右移三位
b = (j & 4) >> 2; //同上
c = (j & 2) >> 1;//同上
d = j & 1; //同上 不移位
t = (b + c + d == 1) + (!b && c) + (a + d == 1) + (!b && c);
//此处是四种表达式结果的和,其中 b+c+d==1 为例,即b+c+d如果等于1 那么这个表达式的值为1,否则为0,t即四个表达式的真值的和,用t的值来判断有几个是真的。
if ((t == 2) && (a + b + c + d == 1)) { //如果其中两个条件为真,即t=2,并且abcd的和为1
printf ("%d,%d,%d,%d\n",a,b,c,d); //输出结果abcd
}

}
getch ();
}
追问
我想知道为什么是2的4次方
还有,左移右移的依据是什么
还有,后面的那串表达式的原理
追答
之所以是4次方,那是因为有四个人,而每个人的答案只有两种可能,即真或假。
左移符号位就没了,这个操作如果不考虑符号位其实左右都一样,
但是右移不会把符号位移走。一个是乘以2的n次方,一个是除以2的n次方
(b + c + d == 1) + (!b && c) + (a + d == 1) + (!b && c);
这个是推理的现实逻辑,你自己好好想想为什么对你帮助才比较大。
挥剑五号
2013-04-30 · TA获得超过317个赞
知道答主
回答量:276
采纳率:0%
帮助的人:47万
展开全部
输出的是0,0,0,1

不对吧。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式