很厉害的交换两个数


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 ;
    这种做法没有简单的形式.

注意:
  此方法唯一的不足就是如果你交换的两个数是同一个地址, 也就是说是同一个变量, 则会导致此变量最终为 0
  因为 a ^= b 的时候, 实际上是将两个数都置为 0, 因此已经丢失了另外一个值.
 
改进:
    上述同一变量导致结果为零, 是因为在同一变量中无法存储异或的结果. 此外, 我们知道, 同一个变量进行 swap 的语义后, 值应该不变. 
    因此我们通过短路法对算式的两个参数为同一值时进行短路. 修改结果如下:
                                    &(a) == &(b) || (a ^= b ^= a ^= b);

 

 

For more Bit hacks, see: http://www.cnblogs.com/walfud/articles/2267167.html

posted @ 2011-03-23 20:34  walfud  阅读(301)  评论(2编辑  收藏  举报