兩個數互換,不使用第三個空間

昨天在一個技術羣中,一大堆人討論“兩個數交換,不使用第三個空間”這個問題。當時我給了個答案。
a = a + b;
b = a - b;
a = a - b;
不過後來發現有數據溢出的問題,比如函數void ChangeAB(int a, int b);如果a = int.MaxValue - 10, 30;(int.MaxValue = 2147483647)那麼就會出現數據溢出的問題。雖然說最後兩個數字是互換了,但是總覺得不好,後來我又給了個答案:
a = a ^ b;
b = a ^ b;
a = a ^ b;
結果一些羣友沒明白啥意思,當時我建議大家補習一下異或的知識。今天抽空,在這裏給大家補充一下第二種方法的解釋。在解釋之前需要學習一下“^”是什麼。“^”是異或的意思。如果學習過離散相信沒人不知道“異或”吧。我們的計算機是2進制,就是“0”和“1”,那麼01之間的異或關係就是下列樣子:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
知道了異或關係,
a = a ^ b;
b = a ^ b;
a = a ^ b;
就十分好解釋了。
我已10和15爲例。比如調用void ChangeAB(int a, int b);的語句爲:this.ChangeAB(10, 15);其處理步驟爲:
1、將10和15轉化成二進制
00000000000000000000000000001010
00000000000000000000000000001111(第32的0代表是正數)
2、下面我開始翻譯
"a = a ^ b;"爲:a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101
"b = a ^ b;"爲:b = 爲:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010
"a = a ^ b;"爲:a = 爲:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111
所以輸出時:a = 00000000000000000000000000001111 = 15,
b = 00000000000000000000000000001010 = 10。
此式子的優勢是無需考慮正負問題,也無需考慮數據溢出問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章