如上所述的问题如下:给定两个整数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;
}
答案 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)
)。