public class Main
{
public static void main(String[] args)
{
int a,b,c,d;
a=1;b=2;
a^=b^=a^=b;
System.out.println(a+" "+b);
c=1;d=2;
c^=d;
d^=c;
c^=d;
System.out.println(c+" "+d);
}
}
我使用^ b ^ = a ^ = b来交换a和b。但是这个程序的输出是
0 1
2 1
我是Java新手,我不知道为什么a是0.这是我的java运行时环境的错误吗?或者Java中有一些特别的东西我不知道?这是java -version。
java version "1.7.0_65"
OpenJDK Runtime Environment (fedora-2.5.2.5.fc20-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
对不起,这是我关于堆栈溢出的第一个问题......如果我忘了一些规则,请告诉我,谢谢。
答案 0 :(得分:4)
让我们一起简化
int a = 1;
int b = 2;
a ^= (b ^= (a ^= b));
System.out.println(a + " " + b);
与说
相同int a = 1;
int b = 2;
int a_tmp = a;
a = a_tmp ^ (b ^= (a ^= b));
System.out.println(a + " " + b);
您的代码假设我们在^ =(b ^ =( a ^ = b a ^ = (b ^ =(a ^ = b)) >))但那是错的。我真的不知道它会在哪里工作。但正如@duffymo指出的那样,不要在家里试试。
答案 1 :(得分:0)
确保查看您的操作顺序。这可能是正在发生的事情:
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false
a^=b^=a^=b;
从右到左工作:0001 ^ 0010 ^ 0001 ^ 0010取第2个最右边 0001 ^ 0010 = 0011.现在继续向左移动你的答案与下一个元素0010 ^ 0011 = 0001现在再向左移动一次。 0001 ^ 0001 = 0000所以a = 0000或0 现在拿b表达式: 0010 ^ 0001 ^ 0010现在从右到左做同样的事情。 0001 ^ 0010 = 0011现在向左移动0010 ^ 0011 = 0001所以b = 0001或1.所以当你打印a = 0000或0和b = 0001或1.这是按位异或运算一定要查看顺序仔细操作。