题目描述:
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
1. 常规办法
该数是一个32位进制数,则对该数进行移位,然后与1相与,若为1,则当前位为1。
代码:
class Solution {
public:
int hammingWeight(uint32_t n) {
if(n <= 1)
return n;
int count = 0;
for(int i = 0; i < 32; ++i)
{
if((n >> i) & 1)//移位,然后 & 1
++count;
}
return count;
}
};
2. 位运算
上述方法显得过于复杂,若后续全是0时,还需要进行额外的移位,造成了时间上的浪费。
采用 n &= n - 1
,当该值为0时,则直接结束循环。
代码:
class Solution {
public:
int hammingWeight(uint32_t n) {
if(n <= 1)
return n;
int count = 0;
while(n)
{
++count;
n &= n - 1;//方法
}
return count;
}
};