给定两个整数,在不使用 if 语句的情况下找到与给定两个不同的第三个整数
Given two integers find a third integer which is different from the given two without using if statment
上述问题如下:给定两个整数x1和x2,在不使用if关键字的情况下,找到另一个与x1和x2都不同的整数x3。
我的解决方案基于对整数的按位运算加上两个位之间的 XOR return 1 当且仅当这两个位不相等时。
这个解决方案有效吗?你能找到更好的解决方案吗?当然,运行时间考虑和内存消耗应该是越多越好。
注意:三元运算和比较(即 - != , == )也是不允许的
提前致谢,
家伙。
我的解决方案:
int foo(int x1,int x2)
{
// xor
int x3 = x1 ^ x2;
// another xor
x3 = x3 ^ x2;
// not
x3 = ~x3;
return x3;
}
迂腐,既然他们说没有 if
关键字,那么三元组应该是公平的游戏...
return (x1+1 == x2) ? x1+2 : x1+1;
当然,也许那是作弊。没问题,这里是 ternary-free 版本:
return x1+1+(x1+1==x2);
别担心,如果您认为条件语句仍然是作弊,many ways 可以通过直接位操作来实现它。
请注意,加法解决方案实际上仅对无符号整数有效,因为它可能会导致有符号溢出(即 UB)。如果担心这一点,您可以将加法替换为其他操作(例如,x1^(1+(x1^1==x2)
)。
将我的评论转换为答案:
你有的是~(x ^ y ^ y)
,就是~x
,所以如果y = ~x
就不行了。一种选择是制作一个数字,该数字在二进制位置不同于 x1,在个位不同于 x2:
return ~(x1 & 2 | x2 & 1);
(将功劳从 (~x1 & 2) | (~x2 & 1)
简化为 @chux。谢谢!)
上述问题如下:给定两个整数x1和x2,在不使用if关键字的情况下,找到另一个与x1和x2都不同的整数x3。
我的解决方案基于对整数的按位运算加上两个位之间的 XOR return 1 当且仅当这两个位不相等时。
这个解决方案有效吗?你能找到更好的解决方案吗?当然,运行时间考虑和内存消耗应该是越多越好。
注意:三元运算和比较(即 - != , == )也是不允许的
提前致谢,
家伙。
我的解决方案:
int foo(int x1,int x2)
{
// xor
int x3 = x1 ^ x2;
// another xor
x3 = x3 ^ x2;
// not
x3 = ~x3;
return x3;
}
迂腐,既然他们说没有 if
关键字,那么三元组应该是公平的游戏...
return (x1+1 == x2) ? x1+2 : x1+1;
当然,也许那是作弊。没问题,这里是 ternary-free 版本:
return x1+1+(x1+1==x2);
别担心,如果您认为条件语句仍然是作弊,many ways 可以通过直接位操作来实现它。
请注意,加法解决方案实际上仅对无符号整数有效,因为它可能会导致有符号溢出(即 UB)。如果担心这一点,您可以将加法替换为其他操作(例如,x1^(1+(x1^1==x2)
)。
将我的评论转换为答案:
你有的是~(x ^ y ^ y)
,就是~x
,所以如果y = ~x
就不行了。一种选择是制作一个数字,该数字在二进制位置不同于 x1,在个位不同于 x2:
return ~(x1 & 2 | x2 & 1);
(将功劳从 (~x1 & 2) | (~x2 & 1)
简化为 @chux。谢谢!)