C語言交換兩個變量(不創建臨時變量)(位運算簡介)

今天呢,我來分享代碼了。

這是在學習過程中的一次作業,題目爲“設計一個程序,交換兩個變量。“

顯然,一般人第一時間想到的就是建立一個變量,用於存儲數據,然後對兩個變量進行賦值交換。

於是就有下面的代碼:

#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位)
按位與(“&”):有1取1,沒1取0。

按位或(“|”):有0取0,沒0取1。

按位異或(“^”):相同取0,不同取1.

按位取反(“~”):0換爲1,1換位0。

左移/右移(“<<”/“>>”):把二進制數最左/最右端的數丟失,再在另一端補數字(左移在右端補0,右移在左端補符號位)


不過歸根結底,使用位運算是比較偏的一種方法,大家以後寫程序,要交換數字的時候,還是安安分分地創建一個臨時變量吧~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章