位运算技巧整理

版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/butterfly5211314/article/details/85028961

为方便描述, 使用几个整数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

欢迎补充指正!

扫描二维码关注公众号,回复: 4855858 查看本文章

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/85028961