使用XOR在单行中交换三个数字

3

分解为 b= a; a= a ^ b ^ a; - user1196549
1个回答

1
你只需要在原语句中将所有赋值(除了想要更改的那个)都抵消即可:
a = a ^ b ^ c ^ (b=c) ^ (c=a);

你将c=ab=c赋值。它们的返回值分别为ac,因此,您想要“对抗”ac,并利用a^a == 0c^c == 0的事实,在开头添加a、c。
另外,你添加了一个b,将a赋值给b的值。

这里有一个ideone演示

请注意,正如在注释中讨论的那样,上述操作是否能成功保证是依赖于具体编程语言的。例如在Java中 - 这是Java编程语言保证运算符的操作数的求值顺序是从左到右。,但在其他语言中如C,则不一定。


1
操作数的求值顺序是未指定的。c=a 可能会在 b=c 之前被求值,两者也可能在 bc 之前被求值。 - n. m.
@n.m. 我需要重新验证一下,但如果我记得正确的话,它是在Java中指定的,例如。 - amit
@n.m. 是的,15.7. Evaluation OrderJava编程语言保证运算符的操作数按照特定的顺序进行评估,即从左到右。 - amit
在Java中这可能是正确的,但很多编程语言并不保证这一点,比如C和C++。 - Filipe Gonçalves
由于没有指定语言,这里提供一个Python示例:a,b,c=b,c,a^0 - n. m.
显示剩余4条评论

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