今天呢,我來分享代碼了。
這是在學習過程中的一次作業,題目爲“設計一個程序,交換兩個變量。“
顯然,一般人第一時間想到的就是建立一個變量,用於存儲數據,然後對兩個變量進行賦值交換。
於是就有下面的代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int t = 0;
printf("請輸入i的值:\n");
scanf("%d",&i);
printf("請輸入j的值:\n");
scanf("%d",&j);
printf("您輸入的值爲:\ni=%d和j=%d\n",i,j);
t=i;
i=j;
j=t;
printf("交換後得知爲:\ni=%d和j=%d\n",i,j);
system("pause");
return 0;
}
這個沒什麼好說的,因爲每一個C語言的初學者都會寫這一個程序。
而另外還有人會想到用加減法去解決這個問題。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
printf("請輸入i的值:\n");
scanf("%d",&i);
printf("請輸入j的值:\n");
scanf("%d",&j);
printf("您輸入的值爲:\ni=%d和j=%d\n",i,j);
i+=j;
j=i-j;
i-=j;
printf("交換後得知爲:\ni=%d和j=%d\n",i,j);
system("pause");
return 0;
}
可是這個程序在i或者j賦值過大的時候有可能會導致溢出。
而今天我get到了個新技能,就是異或。
下面我們來看程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
printf("請輸入i的值:\n");
scanf("%d",&i);
printf("請輸入j的值:\n");
scanf("%d",&j);
printf("您輸入的值爲:\ni=%d和j=%d\n",i,j);
i=i^j;
j=i^j;
i=i^j;
printf("交換後得知爲:\ni=%d和j=%d\n",i,j);
system("pause");
return 0;
}
在此,我先解釋一下異或:C語言中的異或,用^表示,表示的是按位異或。
“按位異或”中,“位”就是指每一個比特位,“異或”的意思就是相同的比特位記爲0,不同的比特位記爲1。
舉個例子,5和15異或,5的二進制代碼爲0101,15的二進制代碼爲1111,按位異或,相同位記0,不同位記1,得到1010,表示10,所以5^15=10。
而在上方代碼中,假設i爲5,j爲15,那在語句“i=i^j;j=i^j;i=i^j;”中。
第一個語句執行之後,i=10=(1010)2,j=15=(1111)2。
第二個語句執行之後,i=10=(1010)2,j=5=(0101)2。
第三個語句執行之後,i=15=(1111)2,j=5=(0101)2。
現在看來,i和j是不是就換過來了呢?
從這個程序,我們可以聯想到,是否還有別的位運算呢?
當然有
位運算名稱 | 表達式 |
按位與 | a&b |
按位或 | a|b |
按位異或 | a^b |
按位取反 | ~a |
左移 | a<<n(左移n位) |
右移 | a>>n(右移n位) |
按位或(“|”):有0取0,沒0取1。
按位異或(“^”):相同取0,不同取1.
按位取反(“~”):0換爲1,1換位0。
左移/右移(“<<”/“>>”):把二進制數最左/最右端的數丟失,再在另一端補數字(左移在右端補0,右移在左端補符號位)
不過歸根結底,使用位運算是比較偏的一種方法,大家以後寫程序,要交換數字的時候,還是安安分分地創建一個臨時變量吧~~~