5

上面提到的问题如下:给定两个整数 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;  

}
4

2 回答 2

4

将我的评论转换为答案:

你所拥有的是~(x ^ y ^ y),这只是~x,所以如果y = ~x. 相反,一种选择是在二位的位置与 x1 不同,在个位的位置与 x2 不同:

return ~(x1 & 2 | x2 & 1);

(从(~x1 & 2) | (~x2 & 1)信用简化到@chux。谢谢!)

于 2017-02-18T09:24:24.860 回答
3

迂腐,因为他们说没有if关键字,所以三元组应该是公平的游戏......

return (x1+1 == x2) ? x1+2 : x1+1;

当然,这可能是作弊。没问题,这是一个无三元的版本:

return x1+1+(x1+1==x2);

不用担心,如果您认为条件仍然是作弊,有很多方法可以通过直接位操作来实现它。

请注意,加法解决方案实际上仅对无符号整数有效,因为它会导致有符号溢出(即 UB)的可能性。如果这是一个问题,您可以将添加替换为另一个操作(例如,x1^(1+(x1^1==x2))。

于 2017-02-18T09:11:11.723 回答