如何使用按位运算符交换两个变量(不是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
答案 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