i = i + j ;
j = i - j ;
i = i - j ;
Run Code Online (Sandbox Code Playgroud)
上面的代码是做什么的?有人可以用其他代码编写相同的操作吗?
日Thnx.
Dbz*_*Dbz 14
这是一种交换创建临时变量i和j不创建临时变量的值的技术.这是一种内存优化
如果您有兴趣了解其中的一些内容,我找到了一个关于交换值的网站:
交换值的另一种方法是使用按位运算符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 = 3和b = 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 = 10和b = 100或a = 2与b = 3
欢迎来到位!
And*_*yle 12
它交换i和j.假设他们有的初始值a和b,行评估为:
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)
大多数使用的swap方法涉及使用临时变量:
T swap = i;
i = j;
j = swap;
swap = null; // or let it fell out of scope
Run Code Online (Sandbox Code Playgroud)
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交换黑客
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,两个索引指的是同一个元素而你的取消是相互的.| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |