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

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

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

                  從上面的豎式可以清楚的看到利用異或運算實現兩個值交換的基本過程。
                 
                  下面從深層次剖析一下:

                  1.對于開始的兩個賦值語句,a = a ^ b,b = b ^ a,相當于b = b ^ (a ^ b) = a  ^ b ^ b,而b ^ b 顯然等于0。因此b = a ^ 0,顯然結果為a。
                  2. 同理可以分析第三個賦值語句,a = a ^ b = (a ^ b) ^ a = b

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

          FeedBack:
          # re: 交換兩個值,不用臨時變量(C位運算)
          2010-04-01 19:05 | sysubo
          用這么麻煩么?
          a = a + b;
          b = a - b;
          a = a - b;  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)
          2010-04-01 20:04 | landonlv
          哈哈,我今天的面試題就是這個。贊一個。@sysubo
            回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)
          2012-07-18 02:47 | zminds
          @sysubo
          a+b或者a-b超出表示范圍的時候就不能這么用了  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)
          2013-04-12 17:11 | 老何
          這個算法在a==b的情況下會出錯,因為 a ^ b=a^a=0,同理后面都會算出0,所以這里要對a==b的情況做特殊處理  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)[未登錄]
          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

          你說的情況是函數傳參時的地址相同  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)
          2014-08-04 14:36 | cch
          @sysubo
          位運算比加減快
          當然任何互逆的運算都是可以的  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)
          2014-08-04 14:40 | cch
          @老何
          不會出錯。
          例:a=b=5;
          a=a^b=5^5=0
          b=b^a=5^0=5
          a=a^b=0^5=5  回復  更多評論
            
          # re: 交換兩個值,不用臨時變量(C位運算)[未登錄]
          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);
          }
            回復  更多評論
            
          主站蜘蛛池模板: 赞皇县| 木兰县| 昌吉市| 嘉禾县| 威远县| 黑龙江省| 阆中市| 金坛市| 金昌市| 建德市| 即墨市| 福泉市| 巨鹿县| 奉新县| 桂林市| 谢通门县| 友谊县| 桦川县| 镇江市| 辉南县| 舒兰市| 凤台县| 图们市| 灌云县| 玉门市| 九龙县| 星子县| 克山县| 阿瓦提县| 灌阳县| 鄂伦春自治旗| 纳雍县| 临西县| 慈利县| 绿春县| 乌拉特前旗| 宜宾县| 巴彦淖尔市| 阳江市| 若羌县| 原平市|