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

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

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

    隨筆-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 一凡 閱讀(1469) 評論(0)  編輯  收藏 所屬分類: JAVA 基礎
    主站蜘蛛池模板: 亚洲欧美日韩综合久久久| 少妇中文字幕乱码亚洲影视| 亚洲精品无码专区在线| 7723日本高清完整版免费| 亚洲视频在线免费看| 免费国产叼嘿视频大全网站| 亚洲AV综合色区无码一区| 91视频免费观看| 久久精品国产精品亚洲蜜月| 99热这里只有精品免费播放| 久久久久亚洲Av无码专| 精品久久久久国产免费| 亚洲熟女综合一区二区三区| 国产黄色片在线免费观看| 日日狠狠久久偷偷色综合免费| 国产性爱在线观看亚洲黄色一级片| 国产在线播放线91免费| 久久久久亚洲精品成人网小说| 18女人水真多免费高清毛片| 亚洲人xxx日本人18| 四虎影视永久免费观看网址| 一级人做人爰a全过程免费视频| 国产成人A亚洲精V品无码| 无码国产精品一区二区免费16| 亚洲精品偷拍无码不卡av| 性色av免费观看| a在线视频免费观看在线视频三区| 亚洲成在人线av| 国产在线观看免费观看不卡| 国产精品亚洲综合网站| 久久亚洲精品视频| 波多野结衣在线免费观看| 免费的黄色的网站| 91亚洲国产成人久久精品网站| 最新仑乱免费视频| 99在线视频免费观看| 亚洲 欧洲 日韩 综合在线| 亚洲无码黄色网址| 午夜国产精品免费观看| 在线播放国产不卡免费视频| 亚洲电影在线播放|