<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 一凡 閱讀(1470) 評論(0)  編輯  收藏 所屬分類: JAVA 基礎
    主站蜘蛛池模板: 亚洲AV无码乱码在线观看裸奔 | 亚洲精品动漫免费二区| 亚洲啪啪AV无码片| 三上悠亚在线观看免费| 亚洲综合色成在线播放| 中文字幕无线码中文字幕免费| 久久精品国产亚洲Aⅴ香蕉| 成年女人视频网站免费m| 亚洲欧美黑人猛交群| A级毛片成人网站免费看| 亚洲国产精品第一区二区三区| 无码免费又爽又高潮喷水的视频 | 亚洲第一页日韩专区| 免费人成大片在线观看播放| 亚洲成AⅤ人影院在线观看| 免费无码婬片aaa直播表情| 亚洲日韩在线中文字幕第一页 | 亚洲色无码一区二区三区| 国产免费网站看v片在线| 97亚洲熟妇自偷自拍另类图片 | 免费国产高清视频| yellow视频免费在线观看| 亚洲AV综合色区无码一区 | 免费va人成视频网站全| 精品国产呦系列在线观看免费 | 亚洲一级黄色大片| 国产乱子伦片免费观看中字| www.av在线免费观看| 亚洲AV无码一区二区三区DV | 日本最新免费网站| 亚洲AV无码国产剧情| 亚洲性猛交XXXX| 国产99视频精品免费专区| 亚洲一区中文字幕在线观看| 四虎影视免费永久在线观看| 久久免费动漫品精老司机| 亚洲av成人一区二区三区在线播放 | 亚洲娇小性色xxxx| 久久精品国产精品亚洲| 日韩视频在线精品视频免费观看 | 亚洲国产精品激情在线观看|