【发布时间】:2014-03-29 10:40:39
【问题描述】:
我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。
这是我尝试过的两个交换函数:
package lang.numeric;
public class SwapVarsDemo {
public static void main(String[] args) {
int a = 2984;
int b = 87593;
swapDemo1(a,b);
swapDemo2(a,b);
}
private static void swapDemo1(int a, int b) {
a^=b^=a^=b;
System.out.println("After swap: "+a+","+b);
}
private static void swapDemo2(int a, int b) {
a^=b;
b^=a;
a^=b;
System.out.println("After swap: "+a+","+b);
}
}
这段代码产生的输出是这样的:
After swap: 0,2984
After swap: 87593,2984
我很想知道,为什么会有这样的说法:
a^=b^=a^=b;
和这个不一样?
a^=b;
b^=a;
a^=b;
【问题讨论】:
-
我认为你被 java 的值传递搞砸了。
-
@EvertonAgner 我看不出传递值与问题有什么关系。究竟在哪里认为传递值会导致问题?
-
很公平,我忽略了这一点。
-
当您以这种方式“交换”值时,java 不是实际上创建了隐式中间对象吗?我认为使用临时变量应该可以提高性能。通常应该尝试使用按位运算来提高性能,仅在没有自动 GC 的语言中。
标签: java expression-evaluation compound-assignment