程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 網絡誤區:不用中間變量交換2個變量的value,最高效的是異或運算.,誤區value

網絡誤區:不用中間變量交換2個變量的value,最高效的是異或運算.,誤區value

編輯:C++入門知識

網絡誤區:不用中間變量交換2個變量的value,最高效的是異或運算.,誤區value


本文記錄了不使用中間變量交換2個變量的value,很多的網絡留言說是直接異或運算就可以了,而且效率很高,是真的嗎?


關於這個問題,網絡上面有很多的解釋,3種方法,我這裡給比較一下各自的優缺點,然後簡單分析一下匯編代碼,分析代碼如下:

#include <stdio.h>
void swap1(int &a,int &b)
{
    int temp = a;
    a = b;
    b = temp;
}
void swap2(int &a,int &b)
{
    a += b;
    b = a - b;
    a -= b;
}
void swap3(int &a,int &b)
{
    a ^= b;//使用異或運算符
    b ^= a;
    a ^= b;
}
//這是第三種的缺點,不能交換float
/*void swap3float(float &a,float &b)
{
    a ^= b;//使用異或運算符
    b ^= a;
    a ^= b;
}*/

void swap3char(char &a,char &b)
{
    a ^= b;//使用異或運算符
    b ^= a;
    a ^= b;
}

int main(void)
{
    int a1 =1,b1 =2;
    int a2 =3,b2 =4;
    int a3 =5,b3 =6;
    int a = 2147483647,b=1;
    swap1(a1,b1);
    swap2(a2,b2);
    swap3(a3,b3);
    printf("a1 = %d,b1 = %d\n",a1,b1);
    printf("a2 = %d,b2 = %d\n",a2,b2);
    printf("a3 = %d,b3 = %d\n",a3,b3);

    swap2(a,b);
    printf("a = %d,b = %d\n",a,b);

//    float a4=1.25,b4=2.51;
//    swap3float(a4,b4);
//    printf("a4 = %f,b4 = %f\n",a4,b4);

    char a5 = 'a',b5 = 'b';
    swap3char(a5,b5);
    printf("a5 = %c,b5 = %c\n",a5,b5);
    return 0;
}
/*
 * 三種交換方式,第一種屬於教科書的方式,屬於低級的
 * 第二種,加減運算時,可能會導致數據的溢出
 * 第三種方法最優。(但是float類型的不能交換)
*/

/*
a1 = 2,b1 = 1
a2 = 4,b2 = 3
a3 = 6,b3 = 5
a = 1,b = 2147483647
a5 = b,b5 = a
Press <RETURN> to close this window...

*/

通過上面的代碼展示,你會發現,啊,原來最高效的運算是異或運算啊。定論別下的太早。看完下面的匯編,我想你心裡就有數了。你不必知道匯編的語句,你只要會數代碼的行數就OK了。


方法1,號稱最笨的方法。匯編代碼如下:

方法2,使用+-運算解決,匯編如下:

方法3,直接異或運算,匯編代碼如下:

在我沒有查看匯編代碼以前,我也輕易了相信了網絡上的留言,甚至某些書籍。在我寫博客以前,我還在相信方法3是最高效的,因為它的思維最接近機器的運算的思維。我還在他人的面前顯擺過自己。但是,現在,我明白了,只有代碼會說實話。swap2和swap3的有效匯編代碼都在21行,而swap1的只有14行,相互差距7行代碼,當然了,如果你的變量開銷很大的話,那麼swap3是很好的,swap2也不錯,就是注意一下運算的時候不要溢出就可以了。當然了,算法的好壞,都是相對了,要看具體的環境情況。現在我想說,遇到什麼知識,能自己測試的,可以測試一下,實踐是檢驗真理的唯一標准。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved