對於C語言中交換兩個數的方法,目前大體上有這么5種:
1:直接利用中間變量進行交換;
2:利用指針傳入函數地址在函數內部進行利用中間變量交換;
3:將兩個需要交換的數進行加減運算進行交換;
注:因C語言有浮點數之分,不可以認為乘除也可進行交換。
4:將兩個數進行亦或運算,也可以實現交換兩個數的目的;
5:對兩個數進行位操作,也可以實現交換兩個數的目的。
接下來我將對后面三種進行分析:
前面兩種太過常見,在此不做說明:
第三種:加減交換
將兩個數之和賦值給第一個數,然后用新第一個數減去第二個數得到舊第一個數,並賦值給第二個數
,再用新第一個數減去新第二個數(舊第一個數)得到舊第二個數,並賦值給第一個數,在此,實現
兩個數的交換,代碼如下:
1 #include<stdio.h>
2 3 int main(){ 4 int a=10,b=20; 5 a+=b; 6 b=a-b; 7 a=a-b; 8 9 return 0; 10 }
注意:此法使用缺陷
當需要交換的兩個數是指向同一下標的數組元素,那么此時,此法失效。
諸君請看:
1 #include<stdio.h> 2 3 int main(){ 4 int a[5] = {1,2,3,4,5}; 5 int i=2,j=2; 6 a[i] += a[j]; //因為i=j;所以此時a[i]=a[j]=2[i]; 7 a[j] = a[i] - a[j];//由上知,此時a[i]=a[j]=0; 8 a[i] = a[i] - a[j];//此時兩者均為0;交換失敗
9 return 0; 10 }
此外,使用此法時應注意兩個數之和不能超過所定義的類型所能表達的最大數,不然也將交換失敗
第四種:異或運算進行交換
在此,我先說一下異或運算的原理:兩個數做異或運算,將兩個數化為二進制,逐位比較,相同者得0,不同者得1;具體如下:
0 1 0 1 1 0 0 1
1 0 0 1 0 1 0 0
運算得 1 1 0 0 1 1 0 1
0 1 0 1 1 0 0 1
與第一個數 至此感悟,代碼如下:
運算得 1 0 0 1 0 1 0 0
1 #include<stdio.h> 2 3 int main(){ 4 int a = 10,b = 20; 5 b ^= a; 6 a ^= b; 7 b ^= a; 8 9 return 0; 10 }
注:和上一方法一樣,此法在對數組使用時也受到相同的限制,但只需在對數組使用之前做一個,判斷確保指向的不是同一個數,
那么我覺得這種方法應是最簡單快捷的。
第五種:位運算進行交換
該方法也是基於二進制進行運算
首先帶大家認識兩個位運算符:>> 箭頭朝右指,故右移運算符 << 箭頭朝左指,故左移運算符
比如 5>>1 表示將5右移一位 --> 即 5的二進制 0 0 0 0 0 1 0 1 右移一位得 0 0 0 0 0 0 1 0 原本末尾的1被移走,高位補0;左移同理
注意:因右邊是數據的最低位,所以當右移出去后,再左移是不能恢復到原來的數字的,但左移不同,左邊剩下的高位都為0,都是存在的,當你的數
字不足夠大時,左移之后是還可以通過右移恢復原數的
當想使用位運算交換兩個數的時,應先對每個數實際二進制位數做簡單估測,再確定所移動位數,下面為交換兩個數的實例
1 #include<stdio.h> 2 3 int main(){ 4 int a = 5,b = 10; 5 a <<= 8; //將a移動到高位 6 a += b; //將b的值加到a移動之后的低位 7 b = a >> 8; //取a原來的值 8 a = a & 0xff ; //取新移進來的b,高位直接通過與運算賦值為0 9 10 return 0; 11 }
注:上述代碼中的&運算符運算原理和亦或相似,這個是如果兩個都為1,則為1,否則為0;
當用此方法進行交換兩個數時,一是兩個 數的大小 比第三種方法還受限制,而且所移的位數不好確定,不推薦使用
第一次寫博客,我知道肯定毛病頗多,望各位大佬口下留情,手下留情,多多指點;謝過謝過