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

5
题目如下:给定两个整数x1和x2,找到另一个整数x3,它与x1和x2都不同,不能使用if关键字。
我的解决方案基于对整数进行位运算,并且根据异或操作的特点,如果两个位不相等,则返回1。
这个解决方案是否有效?你能找到更好的解决方案吗?当然,运行时间和内存消耗应尽可能优秀。
注意:三元操作和比较(即-!=,==)也不被允许。
谢谢。
int foo(int x1,int x2)
{
    // xor
    int x3 = x1 ^ x2;

    // another xor 
    x3 = x3 ^ x2;

    // not
    x3 = ~x3;

    return x3;  

}

1
你手头的代码是 ~(x ^ y ^ y),实际上等价于 ~x。因此当 y = ~x 时,这个代码就无法正常工作。 - Ry-
2
z = x^y; z=z^y 的意思是 z=x,那么 z==~x 可能是 ~x == y 吗? - Jean-Baptiste Yunès
1
你可以使用乘法运算实现伪装的 ifa= c*x+(1-c)*y,当 c==1 时得到 x,当 c==0 时得到 y。或许可以以某种方式运用它? - Jean-Baptiste Yunès
1
@A.Monti - 感谢您的澄清。目标是返回第三个数字,任何数字,但要求如下:1)它不能是x1或x2。2)我不能使用if关键字。 - Guy Avraham
2
无论如何,你都可以在二进制的第二位上与 x1 不同,在第一位上与 x2 不同地生成一个数字:(~x1 & 2) | (~x2 & 1) - Ry-
显示剩余8条评论
2个回答

4

将我的评论转换为回答:

你拥有的是~(x ^ y ^ y),它只是~x,所以如果y = ~x,它就不起作用。另一个选择是制作一个在二进制位上与x1不同且在一进制位上与x2不同的数字:

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

(从(~x1&2)|(~x2&1)简化,感谢@chux。谢谢!)

3
这里的妙处在于,它很容易扩展到3、4、……整数位宽度(也许不适用于非2进制补码的符号位)。 - chux - Reinstate Monica

3

严格来说,既然他们说不允许使用if关键字,那么三目运算符应该是可以使用的...

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

当然,也许这是作弊。没关系,这里有一个不含三元运算符的版本:
return x1+1+(x1+1==x2);

不用担心,如果您认为条件语句仍然有欺骗成分,那么您可以使用直接位运算的方法来实现,这里有很多种实现方式。
请注意,加法解决方案只适用于无符号整数,因为它会导致有可能的带符号溢出(这是未定义行为)。如果这是一个问题,您可以将加法替换为另一种操作(例如,x1^(1+(x1^1==x2))。

1
你正在使用==来查看标志寄存器,这是一个隐式的if - Paul Ogilvie
1
@PaulOgilvie 这毫无意义。 - M.M
1
这段代码有点不好,因为它存在整数溢出的潜在风险。 - Bathsheba
1
@PaulOgilvie 在 C 语言中没有“标志寄存器”,你的观点是无关的。 - EOF
1
Bathsheba:没错,这只适用于无符号整数。(我原本计划将其添加到答案中,但实际上忽略了)。现在已经修复了。 - nneonneo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接