news 2026/8/11 11:09:44

LeetCode 191题解析:汉明重量的三种高效算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 191题解析:汉明重量的三种高效算法

1. 问题背景与核心需求

LeetCode 191题"位1的个数"(Hamming Weight)是计算机科学中一个经典的基础算法问题。题目要求编写一个函数,输入一个无符号整数,返回其二进制表示中'1'的个数。这个问题看似简单,却涉及到位运算、算法优化等计算机科学的核心概念。

在实际开发中,计算二进制中1的个数(即汉明重量)有广泛的应用场景:

  • 密码学中的错误检测与纠正
  • 图像处理中的像素分析
  • 网络协议中的数据校验
  • 嵌入式系统中的寄存器操作

提示:理解汉明重量的概念对深入计算机底层原理很有帮助。这也是为什么像Linux内核这样的系统代码中会频繁出现相关操作。

2. 基础解法:逐位检查法

2.1 算法思路与实现

这是最直观的解法——将数字与1进行按位与运算,检查最低位是否为1,然后右移一位继续检查。

int hammingWeight(uint32_t n) { int count = 0; while (n) { count += n & 1; n >>= 1; } return count; }

2.2 时间复杂度分析

  • 最坏情况下需要检查32位(对于32位无符号整数)
  • 时间复杂度:O(32) → O(1)
  • 空间复杂度:O(1)

2.3 注意事项

  1. 右移操作符的选择:

    • 对于无符号数,使用逻辑右移(>>)
    • 对于有符号数,使用算术右移(>>>)
  2. 循环终止条件:

    • 当n变为0时即可终止,不必检查所有32位
  3. 性能瓶颈:

    • 即使高位全是0,仍然会执行完整循环

3. 优化解法:Brian Kernighan算法

3.1 算法原理

这个巧妙的方法利用了n & (n-1)会将n的最低有效1位变为0的特性。每次执行这个操作都会消除一个1,直到n变为0。

int hammingWeight(uint32_t n) { int count = 0; while (n) { n &= (n - 1); count++; } return count; }

3.2 性能优势

  • 循环次数等于1的个数
  • 对于稀疏的1分布(如0x80000000),只需1次循环
  • 平均情况下比逐位检查快很多

3.3 实际应用场景

Linux内核中就使用了类似的优化:

static inline int hweight32(uint32_t w) { w -= (w >> 1) & 0x55555555; w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w + (w >> 4)) & 0x0f0f0f0f; return (w * 0x01010101) >> 24; }

4. 极致优化:查表法

4.1 实现思路

预先计算0-255所有数字的汉明重量,然后将32位数分成4个8位段分别查表。

int hammingWeight(uint32_t n) { uint8_t table[256] = { /* 预计算的汉明重量表 */ }; return table[n & 0xff] + table[(n >> 8) & 0xff] + table[(n >> 16) & 0xff] + table[n >> 24]; }

4.2 性能特点

  • 时间复杂度:O(1)的固定4次操作
  • 空间换时间:需要256字节的查找表
  • 适合需要频繁调用的场景

4.3 实际应用

这种解法在以下场景特别有用:

  • 高频调用的加密算法
  • 实时图像处理
  • 嵌入式系统对性能要求苛刻的部分

5. 三种解法的对比测试

5.1 测试环境

  • CPU: Intel i7-10750H
  • 编译器: GCC 9.3.0 -O3优化
  • 测试数据: 随机生成的1000万个32位无符号整数

5.2 性能对比

算法类型平均耗时(ms)相对性能
逐位检查法42.71x
Brian Kernighan15.22.8x
查表法8.94.8x

5.3 选择建议

  • 开发初期:使用Brian Kernighan算法,良好的平衡性
  • 性能关键路径:考虑查表法
  • 内存受限环境:选择Brian Kernighan算法

6. 扩展思考:并行计算汉明重量

现代CPU支持SIMD指令,可以进一步优化:

// 使用SSE4.2指令集的POPCNT指令 int hammingWeight(uint32_t n) { return __builtin_popcount(n); }

这种硬件级优化可以比查表法快5-10倍,但需要考虑CPU兼容性问题。

7. 常见问题与调试技巧

7.1 为什么我的结果不对?

常见错误:

  1. 使用了有符号整数导致算术右移
  2. 忘记初始化计数器
  3. 循环条件错误(如使用n > 0而不是n != 0)

7.2 如何验证算法正确性?

测试用例建议:

  • 全0:0x00000000 → 0
  • 全1:0xFFFFFFFF → 32
  • 单个1:0x00000001 → 1
  • 稀疏1:0x10101010 → 4

7.3 性能优化技巧

  1. 使用编译器内置函数(如__builtin_popcount)
  2. 对于特定场景可以特化算法(如已知1很少)
  3. 考虑缓存友好性(查表法可能引起缓存抖动)

8. 实际工程中的应用案例

  1. Redis的bitcount命令

    • 使用查表法和SIMD指令混合实现
    • 针对不同长度的key采用不同策略
  2. 比特币挖矿算法

    • 需要频繁计算哈希值的汉明重量
    • 使用专用硬件加速
  3. 图像处理

    • 计算二值图像的像素密度
    • 使用GPU并行计算

9. 进阶学习路径

  1. 相关LeetCode题目:

      1. 颠倒二进制位
      1. 2的幂
      1. 比特位计数
  2. 计算机系统知识:

    • 补码表示法
    • 位运算的数学性质
    • 硬件指令集优化
  3. 推荐书籍:

    • 《Hacker's Delight》Henry S. Warren
    • 《深入理解计算机系统》Randal E. Bryant

在实际工程中,我倾向于优先使用Brian Kernighan算法,它提供了良好的可读性和性能平衡。只有在确实需要极致性能时才会考虑查表法或硬件指令。对于嵌入式开发,了解这些位操作技巧尤为重要,因为它们经常用于寄存器操作和硬件接口编程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 11:09:23

3分钟极简指南:如何在Word中免费安装APA第7版参考文献格式

3分钟极简指南:如何在Word中免费安装APA第7版参考文献格式 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的参考文献格式而…

作者头像 李华
网站建设 2026/8/11 11:09:19

如何彻底卸载Microsoft Edge浏览器:EdgeRemover工具终极指南

如何彻底卸载Microsoft Edge浏览器:EdgeRemover工具终极指南 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover …

作者头像 李华
网站建设 2026/8/11 11:08:16

智能面条机选购与使用全攻略:从原理到实操,轻松实现面食自由

最近在给家里厨房升级设备时,发现市面上的面条机功能越来越“卷”,从单纯的和面压面,到现在的智能加水、多模头切换,选择困难症都要犯了。特别是对于想在家轻松搞定手擀面、饺子皮,又担心操作复杂、清洗麻烦的朋友来说…

作者头像 李华
网站建设 2026/8/11 11:06:29

3分钟快速上手ComfyUI ControlNet Aux:AI图像控制终极指南

3分钟快速上手ComfyUI ControlNet Aux:AI图像控制终极指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要在ComfyUI中实现精准的AI图像控…

作者头像 李华
网站建设 2026/8/11 11:05:52

2026最新百度网盘解析脚本推荐:复刻PanDownload提速体验

网络传输速率受到多种因素的协同影响,当遇到获取数据速度未达预期的情况时,往往是系统链条中的某个环节存在瓶颈。理解其背后的作用机制,能够帮助我们更高效地优化传输体验。 PanDown - 网盘不限速下载工具PanDown是一款永久免费的网盘解析与…

作者头像 李华