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

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

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

    yeshucheng
    追逐自己,追逐方向,心隨悟所動
    posts - 24,comments - 24,trackbacks - 0
    位運算應(yīng)用口訣

    清零取位要用與,某位置一可用或

    若要取反和交換,輕輕松松用異或

    移位運算

    要點 1 它們都是雙目運算符,兩個運算分量都是整形,結(jié)果也是整形。

         2 "<<" 左移:右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當于乘2。

         3 ">>"右移:右邊的位被擠掉。對于左邊移出的空位,如果是正數(shù)則空位補0,若為負數(shù),可能補0或補1,這取決于所用的計算機系統(tǒng)。

         4 ">>>"運算符,右邊的位被擠掉,對于左邊移出的空位一概補上0。

    位運算符的應(yīng)用 (源操作數(shù)s 掩碼mask)

    (1) 按位與-- &

    1 清零特定位 (mask中特定位置0,其它位為1,s=s&mask)

    2 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask)

    (2) 按位或-- |

        常用來將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask)

    (3) 位異或-- ^

    1 使特定位的值取反 (mask中特定位置1,其它位為0 s=s^mask)

    2 不引入第三變量,交換兩個變量的值 (設(shè) a=a1,b=b1)

        目 標           操 作              操作后狀態(tài)

    a=a1^b1         a=a^b              a=a1^b1,b=b1

    b=a1^b1^b1      b=a^b              a=a1^b1,b=a1

    a=b1^a1^a1      a=a^b              a=b1,b=a1

    二進制補碼運算公式:

    -x = ~x + 1 = ~(x-1)

    ~x = -x-1

    -(~x) = x+1

    ~(-x) = x-1

    x+y = x - ~y - 1 = (x|y)+(x&y)

    x-y = x + ~y + 1 = (x|~y)-(~x&y)

    x^y = (x|y)-(x&y)

    x|y = (x&~y)+y

    x&y = (~x|y)-~x

    x==y:    ~(x-y|y-x)

    x!=y:    x-y|y-x

    x< y:    (x-y)^((x^y)&((x-y)^x))

    x<=y:    (x|~y)&((x^y)|~(y-x))

    x< y:    (~x&y)|((~x|y)&(x-y))//無符號x,y比較

    x<=y:    (~x|y)&((x^y)|~(y-x))//無符號x,y比較

    應(yīng)用舉例

    (1) 判斷int型變量a是奇數(shù)還是偶數(shù)           

    a&1   = 0 偶數(shù)

           a&1 =   1 奇數(shù)

    (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型變量循環(huán)左移k次,即a=a<<k|a>>16-k   (設(shè)sizeof(int)=16)

    (6) int型變量a循環(huán)右移k次,即a=a>>k|a<<16-k   (設(shè)sizeof(int)=16)

    (7)整數(shù)的平均值

    對于兩個整數(shù)x,y,如果用 (x+y)/2 求平均值,會產(chǎn)生溢出,因為 x+y 可能會大于INT_MAX,但是我們知道它們的平均值是肯定不會溢出的,我們用如下算法:

    int average(int x, int y)   //返回X,Y 的平均值

    {   

         return (x&y)+((x^y)>>1);

    }

    (8)判斷一個整數(shù)是不是2的冪,對于一個數(shù) x >= 0,判斷他是不是2的冪

    boolean power2(int x)

    {

        return ((x&(x-1))==0)&&(x!=0);

    }

    (9)不用temp交換兩個整數(shù)

    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)取模運算轉(zhuǎn)化成位運算 (在不產(chǎn)生溢出的情況下)

             a % (2^n) 等價于 a & (2^n - 1)

    (12)乘法運算轉(zhuǎn)化成位運算 (在不產(chǎn)生溢出的情況下)

             a * (2^n) 等價于 a<< n

    (13)除法運算轉(zhuǎn)化成位運算 (在不產(chǎn)生溢出的情況下)

             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 的 相反數(shù) 表示為 (~x+1)

    posted on 2010-03-30 13:59 葉澍成 閱讀(408) 評論(0)  編輯  收藏 所屬分類: 計算機系統(tǒng)
    主站蜘蛛池模板: 国产亚洲精品看片在线观看| 91在线视频免费91| 亚洲一级Av无码毛片久久精品| 亚洲色丰满少妇高潮18p| 无码区日韩特区永久免费系列 | 亚洲高清视频免费| 亚洲精品中文字幕乱码影院| 久久国产精品免费专区| 亚洲AV无码一区东京热久久| 日韩免费电影网址| 亚洲黄色在线观看网站| 1024免费福利永久观看网站| 亚洲第一男人天堂| 国产jizzjizz免费看jizz| 国产成人亚洲综合在线| 亚洲精品tv久久久久久久久久| 一级日本高清视频免费观看| 国产成人亚洲精品青草天美| 91青青青国产在观免费影视| 精品日韩99亚洲的在线发布| 午夜无遮挡羞羞漫画免费| 成人午夜影视全部免费看| 亚洲日韩精品一区二区三区无码| 一级毛片全部免费播放| 亚洲综合一区二区三区四区五区| 国产免费小视频在线观看| 国产一级婬片A视频免费观看| 亚洲AV无码成人精品区在线观看| 又大又硬又爽又粗又快的视频免费 | 一区二区三区在线免费看| 精品亚洲AV无码一区二区三区 | 亚洲日韩国产一区二区三区在线 | 亚洲人成未满十八禁网站| 亚洲国产成人久久一区久久| 国精产品一区一区三区免费视频| 亚洲成电影在线观看青青| 免费真实播放国产乱子伦| 日韩内射激情视频在线播放免费 | 无遮挡呻吟娇喘视频免费播放| 日韩亚洲一区二区三区| 青青视频观看免费99|