c語言不用臨時變數交換兩個數程式分析

來源:互聯網
上載者:User

首先看這樣一個程式

int a, b;

a = a + b;

b = a - b;    此時b = (a + b) - b = a;     (經過第一步a為a+b)

a = a - b;    此時a = (a + b) - a = b;  (經過第二步時b已為a)

可見這個程式實現了a和b的交換。注意+和-互為逆運算,可以得到(a+b)-b=a,埋個伏筆先。

在看這個例子:

int a, b;

a = a ^ b;

b = a ^ b;

a = a ^b;

這樣也可以實現a和b的交換,是不是比較詭異。分析一下就很容易明白為什麼可以這麼實現了。

首先需要熟悉位元運算關於異或^的知識,異或即對應位相同為0,相異為1.假設a為一個二進位位只能取0和1,可以得到這樣幾個恒等式:

a ^ 1 = !a.       把a分別當做0和1,自己運算一下很容易得到這個。

a ^ 0 = a.       還是把a分別當做0和1,自己運算一下很容易得到這個。

a ^ a = 0.                 這個更容易了,每一位都相同,結果肯定為0.

再來看看這個(a^b)^b = a,這個說明了什麼,其實異或^的逆運算就是本身,現在利用上面三個公式就可以證明這個公式。分別令b為0和1,當b為0時,(a^0)^0=a^0=a,  當b為1,(a^1)^1 = !(!a)=a。證畢。(注意a當成二進位位所以!(!a)成立)

再回頭看為什麼可以用異或交換兩個數字:

a = a ^ b;    

b = a ^ b;       (b=a^b=(a^b)^b=a),此時b被賦值為a

a = a ^ b;       (a=a^b=(a^b)^a=(b^a)^a=b),此時a被賦值為b,注意異或滿足交換律)

現在就很容易理解了。

推廣:

實際上,如果定義兩個滿足逆運算的符號#,@,(a#b)@b=a,

a = a # b;

b = a @ b;

a = a @ y;

都可以實現a和b的交換。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.