
LeetCode191.位1的个数
发布日期:2021-05-14 23:50:53
浏览次数:20
分类:精选文章
本文共 1030 字,大约阅读时间需要 3 分钟。
二进制位权重计算是计算二进制数中1的个数,也被称为汉明权重或汉明加权问题。以下是三种常见的计算方法及其优化思路。
方法一:位操作消除法
这种方法利用了二进制数的特性,通过每次与其自身减一进行按位与操作,从而逐步消除末尾的1,统计需要多少次操作使其变为0。
int hammingWeight(uint32_t n) { int ans = 0; while (n) { ans++; n &= n - 1; } return ans;}
这种方法的时间复杂度为O(log n),空间复杂度为O(1)。
方法二:逐位统计法
这种方法通过逐位统计二进制数中的1的个数。通过每次将数右移一位,并与1进行按位与操作,累加结果以获得最终的权重。
int hammingWeight(uint32_t n) { int ans = 0; while (n) { ans += n & 1; n >>= 1; } return ans;}
这种方法也具有时间复杂度O(log n),空间复杂度为O(1)。
方法三:分组掩码法
这种方法利用的位操作特性,将问题拆分为多个部分,分别统计不同位的权重,然后合并各部分的结果。这种方法避免了递归或嵌套结构,简化了计算流程。
int hammingWeight(uint32_t n) { n = (n & 0x55555555) + ((n >> 1) & 0x55555555); // 分解偶数和奇数位 n = (n & 0x33333333) + ((n >> 2) & 0x33333333); // 继续分解更高位 n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F); // 继续分解以下位 n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF); // 继续处理更高层次 n = (n & 0x0000FFFF) + ((n >> 16) & 0x0000FFFF); // 处理剩余位 return n;}
这种方法的时间复杂度为O(log n * 5),每一步分解后通过位操作加总各部分权重,最终得到总数。这种方法避免了循环结构,适合需要高效计算的场景。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月09日 16时42分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MbedOS 设备中的模数转换(ADC)
2019-03-12
【vue】setInterval的嵌套实例
2019-03-12
【SpringBoot】如何配置热部署
2019-03-12
【rabbitMQ】04 如何实现高可用?
2019-03-12
【自考】之信息资源管理(一)
2019-03-12
C# 文本框限制大全
2019-03-12
setup facatory9.0打包详细教程(含静默安装和卸载)
2019-03-12
ionic4 路由跳转传值
2019-03-12
CSDN 怎么写出好看的博客
2019-03-12
Java基本概念:方法
2019-03-12
pwn题shellcode收集
2019-03-12
python中的序列化
2019-03-12
django中使用celery执行异步任务实现
2019-03-12
centos7 安装 mongodb3.6.3
2019-03-12
java有道翻译
2019-03-12
lora技术在无线抄表行业应用
2019-03-12
msfvenom的使用&免杀&外网渗透
2019-03-12
HTTP/2 协议详解
2019-03-12