当前位置: 首页 > article >正文

Brian Kernighan 算法

在C++中,位与运算符 & 用于对两个整数的二进制表示进行逐位与操作。对于每个二进制位,只有当两个操作数的对应位都是 1 时,结果的该位才是 1,否则是 0

表达式 a &= (a - 1) 的作用是将整数 a 的二进制表示中最低位的 1 变为 0。这个操作的原理如下:

  1. 减法操作a - 1 会将 a 的二进制表示中最低位的 1 变为 0,并将其右边的所有 0 变为 1

  2. 与运算:将 aa - 1 进行与运算,结果会将 a 中最低位的 1 变为 0,因为 a - 1 在这个位置是 0,而其他位置保持不变,因为 aa - 1 在其他位置的位都是相同的。

例子:

假设 a 的二进制表示为 101100(十进制为 44)。

  1. 减法操作a - 1 的二进制表示为 101011(十进制为 43)。

  2. 与运算a & (a - 1) 的结果为 101000(十进制为 40)。

可以看到,a & (a - 1) 的结果是将 a 的二进制表示中最低位的 1 变为 0

作用:

这个操作在统计二进制表示中 1 的个数时非常有用。每次执行 a &= (a - 1),都会去掉 a 中的一个 1。因此,执行这个操作的次数就是 a 的二进制表示中 1 的个数。

代码示例:

cpp复制

#include <iostream>
using namespace std;

int main() {
    unsigned int a;
    cin >> a;
    int num = 0;

    // Brian Kernighan 算法
    while (a > 0) {
        a &= (a - 1); // 去掉最低位的1
        num++;
    }

    cout << num << endl;
    return 0;
}

总结:

a &= (a - 1) 是一个高效的位操作,可以用


http://www.kler.cn/a/547727.html

相关文章:

  • HTML,API,RestFul API基础
  • 科普:“表格式 ”与“ 存储格式”
  • 【环境配置】Ubuntu 22.04 C++ header file not found using Vim with YouCompleteMe
  • Redis 设置密码无效问题解决
  • c++--变量内存分配
  • 【开源项目】Excalidraw手绘风格白板(保姆级)教程
  • 如何学BI大数据
  • Html、Markdown的信息提取
  • LabVIEW 中 dotnet.llb 库功能
  • 05-服务保护和分布式事务(Sentinel、Seata)
  • Linux文件管理:硬链接与软链接
  • 图论 - 一些经典小算法思想(无题目例子)
  • 《open3d qt 网格泊松采样成点云》
  • 关于Dest1ny:我的创作纪念日
  • JavaScript原型和原型链
  • 代码随想录二刷|动态规划3
  • 鸿蒙Harmony-应用状态-AppStorage详细介绍
  • 蓝桥杯---排序数组(leetcode第912题)
  • 神经网络常见激活函数 12-Swish函数
  • 游戏引擎学习第104天