给定两个整数,找到第三个整数,它与给定的两个不同,不使用if语句

Guy*_*ham 5 c algorithm bit-manipulation xor bitwise-xor

上面提到的问题如下:给定两个整数x1和x2,找到另一个整数x3,它不同于x1和x2,而不使用if关键字.

我的解决方案基于对整数的逐位运算以及两个位之间的XOR将返回1的事实,当且仅当两个位不相等时.

这个解决方案有效吗?你能找到更好的解决方案吗?当然,运行时考虑和内存消耗应该尽可能好.

注意:三元运算和比较(即 - !=,==)也是不允许的

提前致谢,

盖伊.

我的解决方案

int foo(int x1,int x2)
{
    // xor
    int x3 = x1 ^ x2;

    // another xor 
    x3 = x3 ^ x2;

    // not
    x3 = ~x3;

    return x3;  

}
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 4

将我的评论转换为答案:

\n\n

你所拥有的是~(x ^ y ^ y),这只是~x,所以如果 的话它\xe2\x80\x99t 不起作用y = ~x。一种选择是创建一个数字,\xe2\x80\x99s 与 x1 的双位不同,并且与 x2 的个位不同:

\n\n
return ~(x1 & 2 | x2 & 1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

(简化(~x1 & 2) | (~x2 & 1)来自@chux。谢谢!)

\n

  • 这样做的巧妙之处在于它很容易扩展到 3,4,...integer_width 整数。(也许不是非 2 上的符号位)。 (3认同)