分析交換兩個整數的特殊寫法

2021-06-13 13:11:28 字數 429 閱讀 8654

由於異或與順序無關,則(4)可以寫成:b = b ^ b ^ a …..(5),

由異或的性質知道:b ^ b = 0,所以(5)進一步改寫成b = 0^a,由性質0與任何數異或不改變其值,可知上式子等價於:b=a,由以上分析可得(1),(2)兩句話將a的值放入b中,即執行了(1),(2)後b的值已經改變成a的值,剩下的問題就是如何將原來的b的值放入a中。由於(1)式中對a的值進行了修改,所以將(1)代入到(3)中得到:a = (a^b)^b1……(6),

這裡我將(3)中的b寫成b1是因為括號中的b是表示原來的b值,而(3)式中的b已經不是原來的b,由我們對(1),(2)的分析可知,執行了(1),(2)後b的值等於a,所以b1的值等於原來a的值,所以得到:a = (a^b)^a=a^a^b,進一步得到a=b。

最後(1)(2)(3)三句話可以合併為一句話:a ^= b ^= a ^= b;

兩個整數交換

第乙個程式設計題是 用 c 語言寫乙個函式交換兩整數的值,不借助第三個變數。事實上這個題目一聽到就有了想法,因為以前有做過,形如 方法一 a a b b a b a a b 不過提出了最大的問題,就是兩個正數的溢位問題。這個確實是缺限,以前遇到卻沒去找它的解決方法。此時提出了強轉型別為long in...

五種方法交換兩個整數

備註 int 範圍 2 31 2 31 1 即 2147483648 2147483647 long long 範圍 2 63 2 63 1 即 9223372036854775808 9223372036854775807 第一種方法 三變數法 特點 通用性強,簡潔易懂 includeusing ...

用異或交換兩個整數的陷阱

前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。如下面 void exchange int a,int b 然而,這裡面卻存在著乙個非常隱蔽的陷阱。通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang a i b j 這兒如果i j了 這種情況是很可能發生的 ...