I want to fly higher
          programming Explorer
          posts - 114,comments - 263,trackbacks - 0
          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(5)

          隨筆分類(161)

          隨筆檔案(114)

          文章分類(2)

          文章檔案(2)

          Alibaba

          Comprehensive

          Expert

          Game

          Java

          搜索

          •  

          積分與排名

          • 積分 - 599749
          • 排名 - 78

          最新評(píng)論

          閱讀排行榜

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

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

                  下面用豎式進(jìn)行簡(jiǎn)單說明:(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è)值交換的基本過程。
                 
                  下面從深層次剖析一下:

                  1.對(duì)于開始的兩個(gè)賦值語句,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è)賦值語句,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 閱讀(9286) 評(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)算)[未登錄]
          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

          你說的情況是函數(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)算)[未登錄]
          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)論
            
          主站蜘蛛池模板: 历史| 阜阳市| 太康县| 台东县| 拜城县| 甘德县| 酉阳| 定远县| 泌阳县| 襄城县| 延安市| 普兰店市| 安国市| 鄱阳县| 察哈| 陇西县| 大安市| 济宁市| 利川市| 高邑县| 容城县| 阿勒泰市| 平山县| 宽甸| 屏山县| 东安县| 吉安市| 绥滨县| 突泉县| 乃东县| 晋江市| 云林县| 舞阳县| 元谋县| 永泰县| 南岸区| 碌曲县| 西和县| 辽源市| 濮阳市| 舞钢市|