题目描述
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
问题分析
这里可以用到计算机位运算的技巧,简化问题求解的时间复杂度。
n - 1
可以将n
的二进制数最右边的 1 变成 0,将最右边 1 后面的 0 都变成 1。
通过n
和(n - 1)
的与操作,即n & ( n - 1 )
,可以将n
最右边的 1 变成 0,其余部分不变。
通过不断执行上述的与操作,直到二进制n
变为 0。这样,我们最终进行的与操作次数就是n
二进制数中 1 的个数。
复杂度分析
时间复杂度:取决于二进制中 1 的个数。
空间复杂度:
O
(
1
)
O(1)
O(1)
程序代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while( n ) {
n &= n - 1;
res++;
}
return res;
}
};