以下代码有什么作用?

Bat*_*man 5 java

i = i + j ;
j = i - j ;
i = i - j ;
Run Code Online (Sandbox Code Playgroud)

上面的代码是做什么的?有人可以用其他代码编写相同的操作吗?

日Thnx.

Dbz*_*Dbz 14

这是一种交换创建临时变量ij不创建临时变量的值的技术.这是一种内存优化

如果您有兴趣了解其中的一些内容,我找到了一个关于交换值的网站:

http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/

交换值的另一种方法是使用按位运算符Exclusive Or(XOR)

a = a ^ b

b = a ^ b

a = a ^ b

这种方式是我个人的最爱,因为从概念上思考会更有趣.整数是位组,(1和0)

64位整数有64"1和0"

1和0是二进制的.

1 = 1

10 = 2

11 = 3

100 = 4

101 = 5

111 = 6

这是二进制到十进制的示例.现在,按位运算符XOR的工作方式就像翻转开关一样.所以:

2 ^ 1 = 3:二进制:10 ^ 01 = 11

3 ^ 2 = 1:二进制:11 ^ 10 = 01 = 1

现在您已了解这一点,您可以看到如何与它交换变量.

让我们设置a = 3b = 2(二进制)并尝试它

a = 100

b = 10

a = a ^ b :: a = 100 ^ 10 = 110

b = a ^ b :: b = 110 ^ 10 = 100

a = a ^ b :: a = 110 ^ 100 = 10

现在a = 10b = 100a = 2b = 3

欢迎来到位!


And*_*yle 12

它交换ij.假设他们有的初始值ab,行评估为:

i = a + b;
j = (a + b) - b; // = a
i = (a + b) - a; // = b
Run Code Online (Sandbox Code Playgroud)

要回答你问题的第二部分,另一种选择(更有可能的是,在现实生活中采取的方法,非采访情况)看起来如下:

int tmp = i;
i = j;
j = tmp;
Run Code Online (Sandbox Code Playgroud)

  • 作为pernickity,它交换i和j,假设它们是整数,并且溢出不会发生或由语言适当处理.如果它们不是整数,则可能发生精度损失. (4认同)

Mar*_*gus 6

临时变量交换

大多数使用的swap方法涉及使用临时变量:

T swap = i;
i = j;
j = swap;
swap = null; // or let it fell out of scope
Run Code Online (Sandbox Code Playgroud)

Aritmetical swap

i = i + j ;
j = i - j ; // i + j - j = i
i = i - j ; // i + j - (i + j - j) = j
Run Code Online (Sandbox Code Playgroud)

这种黑客只在以下情况下有效:

  • i并且j整数,它们的总和在2147483647和-2147483648之间.
  • i并且j多头,他们的总和在9223372036854775807和-9223372036854775808之间.

xor swap

有一个类似的xor交换黑客

i = i ^ j;
j = i ^ j; // i ^ j ^ j = i
i = i ^ j; // i ^ j ^ i ^ j ^ j = j
Run Code Online (Sandbox Code Playgroud)

它的变化很小:

a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j]; 
a[i] = a[i] ^ a[j]; 
Run Code Online (Sandbox Code Playgroud)

这种黑客只在以下情况下有效:

  • i != j,两个索引指的是同一个元素而你的取消是相互的.