利用異或操作實現原地交換(in-place)

緣由

刷leetcode的時候,經常會碰到in-place的要求,遇到這種的我一般都是忽略過去,先不去考慮。反正能通過就行但心裏總是過不去這個坎,於是乎,查了一下。

原地交換in-place)的定義

我的理解in-place就是儘量不使用臨時變量

例子

一說到交換,我一般想到的代碼是這樣的

swap(a, b)
{
    int t = a;
    a = b;
    b= t;
}

看,上面佔用了一個臨時變量,大神們用的解法是用異或來解決這個問題,代碼如下

swap(a, b)
{
    a = a^b;
    b = b^a;
    a = b^a;
}

一眼好像看不出來,舉個例子

a = 3, b = 5, a的二進制位11,b的二進制爲101
a^b = 110
110^b = 011,看到了嗎, 和a相等
110^a = 101, 看到了嗎, 和b相等

通過上面的代碼,無需臨時變量就可以使得兩個數字進行交換,是不是很簡單,那麼這樣做的原理是什麼?

原理

其實原理就是兩個數字異或的結果保存了兩個數上每一個二進制位相同或不同的信息

  1. 對於a^b的任意一位,假設第i位,是0
    那麼說明在第i位,a和b的值是相同的,那麼求交換後的b的時候,也就是 b =a^ b^b,在第i位,假設b是0,那麼新的值還是0,因爲a和b在第i位的二進制數字相同,所以這個操作是正確的
  2. 如果對於第i位,是1, 那麼說明第i位,a和b的值是不同的,那麼求交換後的b的時候,也就是 b =a^ b^b,在第i位,假設b是0,那麼新的值是1,對吧,因爲
    a和b在第i位的二進制數字不同,所以這個操作是正確的

原地操作的作用(in-order)的作用

不要小看,節省的臨時變量的空間,要知道,開闢新的空間是需要花費時間的,如果執行100000次操作,in-order的操作節省的時間是很客觀的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章