常用的位元運算技巧

1. 如果乘上一個 2 的倍數數值,可以改用左移運算(Left Shift) 加速 300%

    x = x * 2;
    x = x * 64;

    改為:
        x = x << 1; // 2 = 2 ^ 1
        x = x << 6; // 64 = 2 ^ 6

2. 如果除上一個 2 的倍數數值,可以改用右移運算加速 350%


    x = x / 2;
    x = x / 64;

    改為:
        x = x >> 1; // 2 = 2 ^ 1
        x = x >> 6; // 64 = 2 ^ 6

3. 數值轉整數加速 10%

    x = int(1.232)

    改為:
        x = 1.232 >> 0;

4. 交換兩個數值(swap),使用 XOR 可以加速 20%

    int t = a;
    a = b;
    b = t;

    改為
        a ^= b;
        b ^= a;
        a ^= b;

    或是
        a ^= b ^= a ^= b;

5. 正負號轉換,可以加速 300%

    i = -i;

    改為

        i = ~i + 1; // NOT 寫法

    或是
        i = (i ^ -1) + 1; // XOR 寫法

6. 取餘數,如果除數為 2 的倍數,可利用 AND 運算加速 600%

    x = 131 % 4;

    改為
        x = 131 & (4 - 1);

7. 利用 AND 運算檢查整數是否為 2 的倍數,可以加速 600%

    isEven = (i % 2) == 0;

    改為
        isEven = (i & 1) == 0;

8. 取絕對值加速 20%


    i = x < 0 ? -x : x;

    改為
        i = (x ^ (x >> 31)) - (x >> 31);

9. 比較兩數值相乘之後是否擁有相同的符號,加速 35%

    eqSign = a * b > 0;

    改為
        eqSign = a ^ b > 0;

 

 

其他位元運算技巧

1. RGB 色彩分離
    int 24bitColor = 0xff00cc;
    int r = 24bitColor >> 16;
    int g = 24bitColor >> 8 & 0xFF;
    int b = 24bitColor & 0xFF;

2. RGB 色彩合併
    int r = 0xff;
    int g = 0x00;
    int b = 0xcc;
    var 24bitColor:uint = r << 16 | g << 8 | b;

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 creteken 的頭像
    creteken

    creteken's 隨手記事本

    creteken 發表在 痞客邦 留言(0) 人氣()