很厉害的交换两个数
a = a ^ b;
b = a ^ b;
a = a ^ b; 或者更為簡(jiǎn)單的: a ^= b ^= a ^= b;
個(gè)人理解: 異或操作是個(gè)偉大的發(fā)現(xiàn). 它同時(shí)具備了加法和減法的特性.? 首先, a^b的結(jié)果中以一種組合方式保存了a與b的值. 通過(guò) (a^b)^a即可從組合中還原出b原來(lái)的值. 同理, 再次從組合a中還原出b, 將結(jié)果賦給a即可實(shí)現(xiàn)互換. 同理: 一個(gè)更好理解的變形: a = a + b ;
b = a - b ;
a = a - b ; 這種做法沒(méi)有簡(jiǎn)單的形式.
注意: 此方法唯一的不足就是如果你交換的兩個(gè)數(shù)是同一個(gè)地址, 也就是說(shuō)是同一個(gè)變量, 則會(huì)導(dǎo)致此變量最終為 0!? 因?yàn)?a ^= b 的時(shí)候, 實(shí)際上是將兩個(gè)數(shù)都置為 0, 因此已經(jīng)丟失了另外一個(gè)值. 改進(jìn): ? ? 上述同一變量導(dǎo)致結(jié)果為零, 是因?yàn)樵谕蛔兞恐袩o(wú)法存儲(chǔ)異或的結(jié)果. 此外, 我們知道, 同一個(gè)變量進(jìn)行 swap 的語(yǔ)義后, 值應(yīng)該不變.? ? ? 因此我們通過(guò)短路法對(duì)算式的兩個(gè)參數(shù)為同一值時(shí)進(jìn)行短路. 修改結(jié)果如下: &(a) == &(b) || (a ^= b ^= a ^= b);
?
?
For more Bit hacks, see:?http://www.cnblogs.com/walfud/articles/2267167.html
轉(zhuǎn)載于:https://www.cnblogs.com/walfud/articles/1993049.html
總結(jié)
- 上一篇: Advice for Students-
- 下一篇: Emit学习-进阶篇-定义事件