位运算算法

求二进制整型中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 @   HachikoT  阅读(97)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示