如何
if (x == 1) printf("2\n");
else if (x == 2) printf("1\n");
else printf("0\n");
使用按位运算符?
我的尝试是:
for (x = 0; x < 8; x++) {
printf("%d\n", 0x03 & (0x03 ^ x));
}
输出:
3
2
1
0
3
2
1
0
期望的输出:
0
2
1
0
0
0
0
0
答案 0 :(得分:11)
这太疯狂了,但我终于明白了:
printf("%d\n", (3 & ~(x & 3)) & (0xfc >> (x << 1)));
答案 1 :(得分:7)
不确定“按位”要求...如果你想压缩代码,出于一些奇怪的原因(if
版本非常容易理解这是一个很好的事情),你可能会这样做:
printf("%c\n", "210"[i == 0 ? 0 : i == 1 ? 1 : 2]);
这当然几乎是最糟糕的解决方案,因为它过于“聪明”:代码的任何读者都必须花费宝贵的时间对其进行解码,以了解正在发生的事情。
答案 2 :(得分:5)
这是一个只需要两个操作的答案:
printf("%d\n", (4 >> x) & 3);
答案 3 :(得分:1)
不确定为什么,但......
for (x = 0; x < 8; x++) {
printf("%d %d\n", x, !x|~3&x?0:3^x);
}
答案 4 :(得分:1)
经过几次错误启动后,解决方案有六个按位操作:
#include <stdio.h>
int main()
{
int x, y;
for (x = 0; x < 8; ++x)
{
y = !(x ^ 1) << 1 | !(x ^ 2);
printf("x = %d, y = %d\n", x, y);
}
return 0;
}
(请注意,!
是否为真正的按位运算符是有争议的。)