隨筆-204  評論-90  文章-8  trackbacks-0

          摘自:http://edu.codepub.com/2009/0929/15909.php
          應用舉例
          (1) 判斷int型變量a是奇數還是偶數           
          a&1  = 0 偶數
                a&1 =  1 奇數
          (2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
          (3) 將int型變量a的第k位清0,即a=a&~(1 < <k)
          (4) 將int型變量a的第k位置1, 即a=a ¦(1 < <k)
          (5) int型變量循環左移k次,即a=a < <k ¦a>>16-k  (設sizeof(int)=16)
          (6) int型變量a循環右移k次,即a=a>>k ¦a < <16-k  (設sizeof(int)=16)
          (7)整數的平均值
          對于兩個整數x,y,如果用 (x+y)/2 求平均值,會產生溢出,因為 x+y 可能會大于INT_MAX,但是我們知道它們的平均值是肯定不會溢出的,我們用如下算法:
          int average(int x, int y)  //返回X,Y 的平均值
          {   
              return (x&y)+((x^y)>>1);
          }
          (8)判斷一個整數是不是2的冪,對于一個數 x >= 0,判斷他是不是2的冪
          boolean power2(int x)
          {
              return ((x&(x-1))==0)&&(x!=0);
          }
          (9)不用temp交換兩個整數
          void swap(int x , int y)
          {
              x ^= y;
              y ^= x;
              x ^= y;
          }
          (10)計算絕對值
          int abs( int x )
          {
          int y ;
          y = x >> 31 ;
          return (x^y)-y ;        //or: (x+y)^y
          }
          (11)取模運算轉化成位運算 (在不產生溢出的情況下)
                  a % (2^n) 等價于 a & (2^n - 1)
          (12)乘法運算轉化成位運算 (在不產生溢出的情況下)
                  a * (2^n) 等價于 a < < n
          (13)除法運算轉化成位運算 (在不產生溢出的情況下)
                  a / (2^n) 等價于 a>> n
                  例: 12/8 == 12>>3
          (14) a % 2 等價于 a & 1       
          (15) if (x == a) x= b;
                      else x= a;
                  等價于 x= a ^ b ^ x;
          (16) x 的 相反數 表示為 (~x+1)


          實例

              功能              ¦          示例            ¦    位運算
          ----------------------+---------------------------+--------------------
          去掉最后一位          ¦ (101101->10110)          ¦ x >> 1
          在最后加一個0        ¦ (101101->1011010)        ¦ x < < 1
          在最后加一個1        ¦ (101101->1011011)        ¦ x < < 1+1
          把最后一位變成1      ¦ (101100->101101)          ¦ x ¦ 1
          把最后一位變成0      ¦ (101101->101100)          ¦ x ¦ 1-1
          最后一位取反          ¦ (101101->101100)          ¦ x ^ 1
          把右數第k位變成1      ¦ (101001->101101,k=3)      ¦ x ¦ (1 < < (k-1))
          把右數第k位變成0      ¦ (101101->101001,k=3)      ¦ x & ~ (1 < < (k-1))
          右數第k位取反        ¦ (101001->101101,k=3)      ¦ x ^ (1 < < (k-1))
          取末三位              ¦ (1101101->101)            ¦ x & 7
          取末k位              ¦ (1101101->1101,k=5)      ¦ x & ((1 < < k)-1)

          取右數第k位          ¦ (1101101->1,k=4)          ¦ x >> (k-1) & 1

          把末k位變成1          ¦ (101001->101111,k=4)      ¦ x ¦ (1 < < k-1)
          末k位取反            ¦ (101001->100110,k=4)      ¦ x ^ (1 < < k-1)
          把右邊連續的1變成0    ¦ (100101111->100100000)    ¦ x & (x+1)
          把右起第一個0變成1    ¦ (100101111->100111111)    ¦ x ¦ (x+1)
          把右邊連續的0變成1    ¦ (11011000->11011111)      ¦ x ¦ (x-1)
          取右邊連續的1        ¦ (100101111->1111)        ¦ (x ^ (x+1)) >> 1
          去掉右起第一個1的左邊 ¦ (100101000->1000)        ¦ x & (x ^ (x-1))
          判斷奇數      (x&1)==1
          判斷偶數 (x&1)==0       

          例如求從x位(高)到y位(低)間共有多少個1

          public static int FindChessNum(int x, int y, ushort k)
                  {
                      int re = 0;
                      for (int i = y; i <= x; i++)
                      {
                          re += ((k >> (i - 1)) & 1);
                      }
                      return re;
                  }

          posted on 2010-10-29 12:21 一凡 閱讀(1470) 評論(0)  編輯  收藏 所屬分類: JAVA 基礎
          主站蜘蛛池模板: 彰化县| 轮台县| 英山县| 吉水县| 新邵县| 房产| 广东省| 横山县| 千阳县| 喜德县| 历史| 广宗县| 延庆县| 乌鲁木齐县| 金山区| 林西县| 黄龙县| 蓬莱市| 泾阳县| 西乌珠穆沁旗| 敖汉旗| 永州市| 紫阳县| 通州市| 桃园县| 文登市| 五指山市| 永康市| 商河县| 彭山县| 延长县| 咸阳市| 灵丘县| 津南区| 正镶白旗| 荥阳市| 绥芬河市| 原阳县| 镇平县| 漳平市| 内丘县|