很厉害的交换两个数
a = a ^ b;
b = a ^ b;
a = a ^ b;
b = a ^ b;
a = a ^ b;
或者更为简单的:
a ^= b ^= a ^= b;
个人理解:
异或操作是个伟大的发现. 它同时具备了加法和减法的特性.
首先, a^b的结果中以一种组合方式保存了a与b的值.
通过 (a^b)^a即可从组合中还原出b原来的值. 同理, 再次从组合a中还原出b, 将结果赋给a即可实现互换.
同理:
一个更好理解的变形:
a = a + b ;
b = a - b ;
a = a - b ;
b = a - b ;
a = a - b ;
这种做法没有简单的形式.
注意:
此方法唯一的不足就是如果你交换的两个数是同一个地址, 也就是说是同一个变量, 则会导致此变量最终为 0!
因为 a ^= b 的时候, 实际上是将两个数都置为 0, 因此已经丢失了另外一个值.
改进:
上述同一变量导致结果为零, 是因为在同一变量中无法存储异或的结果. 此外, 我们知道, 同一个变量进行 swap 的语义后, 值应该不变.
因此我们通过短路法对算式的两个参数为同一值时进行短路. 修改结果如下:
&(a) == &(b) || (a ^= b ^= a ^= b);
For more Bit hacks, see: http://www.cnblogs.com/walfud/articles/2267167.html