程序實現兩個整型數值的交換
題目:請寫出一個小程序,實現對兩個整型數值一個和b的交換
思路1:交換兩個數值,最一般的做法,是創建一個臨時變量臨時,這個變量我們需要的不是它具體的值起到什麽作用,而是要借用它所開辟出來的空間,進行被交換變量的暫時存放將一個的值存入臨時,再將b存入一個中,然後再將溫度裏存的一個的值放入b中,即可實現一個與b的交換,如圖:
1 #include<stdio.h>
2
3 int main()
4 {
5
6 int a = 10, b = 20;
7 int temp;
8 printf("交換前:a=%d,b=%d\n ", a, b);
9
10 temp = a;
11 a = b;
12 b = temp;
13
14 printf("交換後:a=%d,b=%d\n", a, b);
15
16 return 0;
17 }
View Code
則其結果:
那麽像這樣的題目,有沒有值得優化的地方呢。當然是有的,比如,假設現在禁止使用這個中間變量溫度,難道就不能再進行交換了嗎。當然是可以的,這裏給出優化的思路2,比如可以使用數值計算的方法,如圖分析
代碼實現:
1 #include<stdio.h>
2 int main()
3 {
4 int a = 10, b = 20;
5 printf("交換前:a=%d,b=%d\n", a, b);
6
7 a = a + b;
8 b = a - b;
9 a = a - b;
10 printf("交換後:a=%d,b=%d\n", a, b);
11
12 return 0;
13 }
View Code
這裏並不用擔心數字大小的問題,因為做減法運算的變量a實際上是對a,b求和之後的結果覆蓋了。變量值已經發生變化了。故而結果仍舊在預期:
但是這個做法有沒有問題呢?當然是有的,因為我們知道整型值的存儲是有取值範圍的,當我們的變量進行相加時,需要註意的是,如果數值很小,是沒有問題的。比如現在要交換的兩個值進行相加,結果他們的和超過了範圍,那麽會發生溢出,這時在使用加法運算就有問題了,並且如果是想要引申到浮點型數據的交換,就會發生精度損失,那麽就可以看出,思路2也是有缺陷的
優化思路3:運用位運算操作符異或^
異或的功能是兩個二進制值相同結果為0,相異結果為1,這裏將a和b先分別轉化為二進制數,讓a與b異或,再讓得出的結果分比對a和b進行異或操作。可以看出異或的結果就如同一串密碼,一次異或相當於加密,兩次異或相當於解密
代碼實現:
1 #include<stdio.h>
2
3
4 int main()
5 {
6 int a = 10, b = 20;
7
8 printf("交換前:a=%d,b=%d\n", a, b);
9
10 a ^= b;
11 b ^= a;
12 a ^= b;
13
14 printf("交換後:a=%d,b=%d\n", a, b);
15
16 return 0;
17 }
View Code
采用異或就可以避免數據過大造成的溢出了,原因是,異或其實也被稱為不進位加法,它既然結果不會發生進位,那麽只要參與交換的變量取值沒有溢出,進行異或操作就永遠不會發生溢出。
當然異或操作進行交換,也不是沒有局限性的。
作為二進制進行為操作運算,故而這個方法就只適用於整型值之間的交換了。
程序實現兩個整型數值的交換