1. 程式人生 > >位運算技巧整理

位運算技巧整理

為方便描述, 使用幾個整數n, a, b, k.
常用的幾種運算子號: &(與), |(或), ~(反), ^(異或), <<(左移), >>(右移), >>>(無符號右移)

  • n左移(<<)k位即為 n 2 k

    n * 2^k

  • n右移(>>)k位即為 n / 2 k

    n / 2^k

  • 計算2的k次方: 2 << (k-1)

  • 計算 n % 2 k

    n \% 2^k (對2的k次方取餘): n & (m - 1) (m= 2 k 2^k )

  • 判斷奇偶性
    原理: 如果n為奇數, 展開最後一位為1, 否則為0

    if (n & 1) {
        // 奇數
    } else {
        // 偶數
    }
    
  • 取指定位
    比如前端常見的應用, 十六進位制顏色轉十進位制

    var color = '#ccddee';
    var hex = color.substr(1);
    hex = parseInt('0x' + hex, 16);
    
    // RRGGBB
    var R = (hex >> 16) & 0xff;
    var G = (hex >> 8) & 0xff;
    var B = hex & 0xff;
    
    console.log(R, G, B); // 204 221 238
    console.log('#' + R.toString(16) + G.toString(16) + B.toString(16)); // #ccddee
    
    
  • 使用異或交換兩個整數。

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    
  • n & (n - 1)將整數n的最後一位為1的位變成0

    • 統計n的二進位制表示中1的個數
    int getOnes(int n) {
        int count = 0;
    
        while (n) {
            n = n & (n - 1);
            ++count;
        }
        return count;
    }
    
    int judge(int n){
        if n <= 0 {
            return 0;
        }
        return n & (n-1) == 0 ? 1 : 0;
    }
    
  • 取相反數:n = ~n + 1

歡迎補充指正!