按位排除值

时间:2014-01-14 09:44:45

标签: c bit-manipulation

如何

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

5 个答案:

答案 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;
}

(请注意,!是否为真正的按位运算符是有争议的。)