如何使用按位运算符交换两个变量(不是XOR,没有临时var)

时间:2017-02-24 14:08:58

标签: java

如何使用按位运算符交换两个变量(不是XOR,没有临时var)。我需要通过两种方式交换两个变量,一种是XOR,如下所示:

int x = 10;
int y = 22;
x = x ^ y;
y = y ^ x;  // y is now 10
x = x ^ y;  // x is now 22

2 个答案:

答案 0 :(得分:2)

XOR,p ^ q,可以使用and {&)或(|),而不是/ invert(~)位运算符表示为{{ 1}}(参见Wikipedia' s exclusive or文章)。因此,我们现在可以使用其他按位运算符模拟XOR来执行常规交换。

(p & q) | ~(p & q)

虽然注意Java会创建临时变量来存储表达式中的中间值(例如int x = 1; int y = 2; x = (x & y) | ~(x & y); y = (y & x) | ~(y & x); x = (x & y) | ~(x & y); 的结果),所以在实践中或在实际体系结构上,这比仅仅将变量存储在临时变量中要慢,但从理论的角度来看,它可能会满足你的问题。

请注意,@ ytoamn的答案是比我更好的解决方案,因为JVM不需要创建额外的临时变量来存储表达式的中间部分。 (并不只是一个XOR解决方法)

答案 1 :(得分:2)

1种方式是使用第三种变量,另一种是使用加法和减法

a = 10, b = 7

a = a - b ; // a = 3
b = b + a ; // b = 10
a = b - a ; // a = 7