用異或運(yùn)算進(jìn)行兩個值的交換

什么是異或運(yùn)算?就是不一樣的位得1,一樣的位得0。

交換兩個數(shù)的值可以有這騷操作

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    a^=b^=a^=b;
    printf("%d %d",a,b);
    return 0;
}

它是如何做到的呢?

先來看這樣一個例子:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    a = a + b;
    b = a - b;
    a = a - b;
    printf("%d %d",a,b);
    return 0;
}

原理就是相加后減己得他。

再來看異或交換如何做到的

  • 首先明確一點(diǎn),異或的位運(yùn)算各位之間不會相互干擾,所以單獨(dú)拿出一位來研究就行了。
    *先看兩數(shù)相同的情況,即都為1或都為0,異或運(yùn)算完的值為零,分別與0異或運(yùn)算得他本身。
    • 兩數(shù)不相同,一個1一個0的話。異或運(yùn)算完是1,0與1異或得另一個數(shù)1,1與1異或得另一個數(shù)0。
    • 因?yàn)槊恳晃欢际侨绱?,所以兩個任意正整數(shù)都可以如此交換
  • 與剛剛上邊加減法交換的例子有什么關(guān)系嗎?我們加兩條新規(guī)定
    • 因?yàn)椴淮嬖谶M(jìn)位所以我們定義1+1=0。
    • 定義1與0的減法只能大減小。
    • 再看上邊的例子是不是就明白了。

效率如何

#include <stdio.h>
#include <time.h>

int main()
{

    int n=2000000000;
    while(n--){
        int a = 12345678;
        int b = 23456789;
//        int t=a;
//        a=b;
//        b=t;

        a^=b^=a^=b;
    }
    printf("%f\n",(double)clock()/CLOCKS_PER_SEC);
    return 0;
}

加入第三個變量快一點(diǎn)點(diǎn),以上數(shù)據(jù)分別為平均10s和平均12s。

那么問題來了含有負(fù)數(shù)的運(yùn)算為什么也適用呢?

下次研究一下反碼補(bǔ)碼


參考《算法競賽入門經(jīng)典(第二版)》P9最下邊小字。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容