int a,b; a=10; b=15;int t; t=a; a=b; b=t;
這個演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明了,不會產生歧義,便於程式設計師之間的交流,一般情況下碰到交換變數值的問題,都應採用此演算法(以下稱為標準演算法)。
int a,b; a=10;b=12; a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10
它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。
int *a,*b; //假设*a=new int(10);*b=new int(20); //&a=0x00001000h,&b=0x00001200ha=(int*)(b-a); //&a=0x00000200h,&b=0x00001200hb=(int*)(b-a); //&a=0x00000200h,&b=0x00001000ha=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
透過以上運算a、b的位址真的已經完成了交換,且a指向了原先b指向的值,b指向原先a指向的值了嗎?上面的程式碼可以透過編譯,但是執行結果卻令人匪夷所思!原因何在?
if(a<b) { a=(int*)(b-a); b=(int*)(b-(int(a)&0x0000ffff)); a=(int*)(b+(int(a)&0x0000ffff)); }else{ b=(int*)(a-b); a=(int*)(a-(int(b)&0x0000ffff)); b=(int*)(a+(int(b)&0x0000ffff)); }
演算法做的最大改進就是採用位元運算中的與運算“int(a)&0x0000ffff”,因為位址中高16位元為段位址,後16位元為位移位址,將它和0x0000ffff進行與運算後,段位址被屏蔽,只保留位移位址。這樣就原始演算法吻合,從而得到正確的結果。
此演算法同樣沒有使用第三變數就完成了值的交換,與算術演算法比較它顯得不好理解,但是它有它的優點即在交換很大的資料類型時,它的執行速度比算術算法快。因為它交換的時位址,而變數值在記憶體中是沒有移動過的。 (以下稱為地址演算法)int a=10,b=12; //a=1010^b=1100;a=a^b; //a=0110^b=1100;b=a^b; //a=0110^b=1010;a=a^b; //a=1100=12;b=1010;
此演算法能夠實現是由異或運算的特點決定的,透過異或運算能夠使資料中的某些位元翻轉,其他位元不變。這意味著任意一個數與任意一個給定的值連續異或兩次,值不變。
int exchange(int x,int y) { stack S; push(S,x); push(S,y); x=pop(S); y=pop(S); }
以上演算法都實作了不借助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位元演算法計算量相當,位址演算法中計算較複雜,卻可以很輕鬆的實作大類型(例如自訂的類別或結構)的交換,而前兩種只能進行整形資料的交換(理論上重載「^」運算符,也可以實現任意結構的交換)。
以上是交換兩個變數的值且不使用第三個變數的四種法方的詳細內容。更多資訊請關注PHP中文網其他相關文章!