很厉害的交换两个数
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
轉載于:https://www.cnblogs.com/walfud/articles/1993049.html
總結
- 上一篇: Advice for Students-
- 下一篇: Emit学习-进阶篇-定义事件