给定两个整数找到第三个整数,它不同于给定的两个而不使用if statment

时间:2017-02-18 08:46:09

标签: 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;  

}

2 个答案:

答案 0 :(得分:4)

将我的评论转换为答案:

你所拥有的是~(x ^ y ^ y),它只是~x,因此如果y = ~x则不起作用。一个选项是在两位置创建一个与x1不同的数字,在一个位置上与x2不同:

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

(从(~x1 & 2) | (~x2 & 1)赠送到@chux的简化。谢谢!)

答案 1 :(得分:3)

迂腐,因为他们说没有if关键词,那么三元应该是公平的游戏......

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

当然,也许这就是作弊。没问题,这是一个三元免费版本:

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

不要担心,如果您认为条件仍在作弊,则many ways可以通过直接位操作来实现它。

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