<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0
            今天復(fù)習(xí)C語(yǔ)言的時(shí)候,看到位運(yùn)算這章。記得以前學(xué)習(xí)C語(yǔ)言的時(shí)候,都沒(méi)怎么關(guān)注這一章。只是記得幾個(gè)位運(yùn)算符,&:按位與,|:按位或,^:按位異或,~:取反,<<:左移,>>:右移,知道其中的含義罷了。不過(guò)當(dāng)看完這一章,確實(shí)是受益匪淺。尤其是利用”異或“運(yùn)算,實(shí)現(xiàn)交換兩個(gè)值,而不用臨時(shí)變量。
            通常我們交換兩個(gè)值,都是用一個(gè)臨時(shí)的變量temp,拿交換a,b的值為例,通常的做法是:temp = a;a = b;b = temp;不過(guò)利用位運(yùn)算,真的是方便很多:
            假如 a = 3,b = 4。想將a和b的值互換,可以用一下賦值語(yǔ)句實(shí)現(xiàn):

            a = a ^ b;
            b = b ^ a;
            a = a ^ b;

            下面用豎式進(jìn)行簡(jiǎn)單說(shuō)明:(10進(jìn)制化為二進(jìn)制)
        
            a = 011
    (^)    b = 100
    則    a = 111(a ^ b的結(jié)果賦值給a,a已變成了7)
    (^)    b = 100
    則    b = 011(b^a的結(jié)果賦給b,b已經(jīng)變成了3)
    (^)    a = 111
    則    a = 100(a^b的結(jié)果賦給a,a已經(jīng)變成了4)    

            從上面的豎式可以清楚的看到利用異或運(yùn)算實(shí)現(xiàn)兩個(gè)值交換的基本過(guò)程。
           
            下面從深層次剖析一下:

            1.對(duì)于開始的兩個(gè)賦值語(yǔ)句,a = a ^ b,b = b ^ a,相當(dāng)于b = b ^ (a ^ b) = a  ^ b ^ b,而b ^ b 顯然等于0。因此b = a ^ 0,顯然結(jié)果為a。
            2. 同理可以分析第三個(gè)賦值語(yǔ)句,a = a ^ b = (a ^ b) ^ a = b

            注:1.^ 即”異或“運(yùn)算符。它的意思是判斷兩個(gè)相應(yīng)的位值是否為”異“,為”異"(值不同)就取真(1);否則為假(0)。
                    2.^運(yùn)算符的特點(diǎn)是與0異或,保持原值;與本身異或,結(jié)果為0。
    posted on 2010-03-12 18:18 landon 閱讀(9269) 評(píng)論(8)  編輯  收藏 所屬分類: Program

    FeedBack:
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2010-04-01 19:05 | sysubo
    用這么麻煩么?
    a = a + b;
    b = a - b;
    a = a - b;  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2010-04-01 20:04 | landonlv
    哈哈,我今天的面試題就是這個(gè)。贊一個(gè)。@sysubo
      回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2012-07-18 02:47 | zminds
    @sysubo
    a+b或者a-b超出表示范圍的時(shí)候就不能這么用了  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2013-04-12 17:11 | 老何
    這個(gè)算法在a==b的情況下會(huì)出錯(cuò),因?yàn)? a ^ b=a^a=0,同理后面都會(huì)算出0,所以這里要對(duì)a==b的情況做特殊處理  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)[未登錄](méi)
    2013-04-15 11:07 | K
    @老何
    a = b = 2;
    a ^= b; //a = 0
    b ^= a; //b = b ^ 0;b = b = 2
    a ^= b; //a = 0 ^ b;a = b = 2

    你說(shuō)的情況是函數(shù)傳參時(shí)的地址相同  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2014-08-04 14:36 | cch
    @sysubo
    位運(yùn)算比加減快
    當(dāng)然任何互逆的運(yùn)算都是可以的  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)
    2014-08-04 14:40 | cch
    @老何
    不會(huì)出錯(cuò)。
    例:a=b=5;
    a=a^b=5^5=0
    b=b^a=5^0=5
    a=a^b=0^5=5  回復(fù)  更多評(píng)論
      
    # re: 交換兩個(gè)值,不用臨時(shí)變量(C位運(yùn)算)[未登錄](méi)
    2016-06-16 20:49 | 123
    #include<stdio.h>
    void swap(int *a, int *b)
    {
    *a = (*a) ^ (*b);
    *b = (*a) ^ (*b);
    *a = (*a) ^ (*b);
    }
    int main(void)
    {
    int a, b;
    printf("please input two integers for example\n");
    scanf("%d %d",&a,&b);
    printf("Before swap a = %d, b = %d\n",a,b);
    swap(&a,&b);
    printf("After swap a = %d, b = %d\n",a,b);
    }
      回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲2022国产成人精品无码区 | 国产日韩精品无码区免费专区国产 | 在线视频亚洲一区| 99久久99这里只有免费费精品| 久久亚洲伊人中字综合精品| 国产午夜成人免费看片无遮挡 | 亚洲精品一级无码鲁丝片| 国产产在线精品亚洲AAVV| 免费在线观看一级毛片| 成人午夜免费视频| 亚洲乱码一区二区三区在线观看| 免费人成在线观看视频高潮| 亚洲av无码不卡一区二区三区| 四虎国产精品永久免费网址| 亚洲成AV人综合在线观看| 国产电影午夜成年免费视频| 亚洲午夜精品久久久久久app| 日韩高清在线高清免费| 美女扒开尿口给男人爽免费视频| 国产免费131美女视频| 永久免费精品影视网站| 亚洲国产精品无码专区影院| xxxxwww免费| 亚洲丶国产丶欧美一区二区三区| 亚洲第一成人影院| 免费无码又爽又刺激一高潮| 亚洲精品人成电影网| 全免费a级毛片免费**视频| 一二三四在线观看免费中文在线观看| 亚洲成亚洲乱码一二三四区软件| 国产四虎免费精品视频| 国产精品亚洲片在线花蝴蝶| 久久亚洲精品中文字幕三区| 美女视频黄是免费的网址| 国产精品亚洲专区无码WEB | 最新精品亚洲成a人在线观看| 67pao强力打造国产免费| 亚洲欧美日韩一区二区三区在线| 成人午夜亚洲精品无码网站| 国产精品1024永久免费视频| 免费毛片毛片网址|