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),每一步分解后通过位操作加总各部分权重,最终得到总数。这种方法避免了循环结构,适合需要高效计算的场景。

上一篇:LeetCode338. 比特位计数
下一篇:LeetCode342.4的幂

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月09日 16时42分57秒