位运算算法

求二进制整型中1的个数

n & (n - 1) 会使n的二进制中最后一位1变成0,利用这一点计数,直到把n所有的1都变为0。

int numOfOnes(int n) {
    int cnt = 0;
    while (n) {
        cnt++;
        n &= n - 1;
    }
    return cnt;
}

判断一个数是否为2的幂

同上

bool isPowerOftwo(int n) {
    return !(n & (n - 1));
}

获取某个二进制数的LowBit

x & -x可以获取x中最低位的1,-x 的值, 其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得。

int lowBit(int n) {
    return n & -n;
}

int main(int argc, char const *argv[])
{
    // 输出8
    std::cout << lowBit(8 + 16) << std::endl;

    return 0;
}

计算最高位为1的bit

这里用二分法效率更高

int ilog2(uint32_t x) {
  int ans = 0;
  ans = ans + ((!!(x>>(16 + ans)))<<4);
  ans = ans + ((!!(x>>(8 + ans)))<<3);
  ans = ans + ((!!(x>>(4 + ans)))<<2);
  ans = ans + ((!!(x>>(2 + ans)))<<1);
  ans = ans + ((!!(x>>(1 + ans)))<<0);

  return ans;
}
posted @ 2020-12-09 21:32  HachikoT  阅读(96)  评论(0编辑  收藏  举报