题目:二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
解题:
n - 1的二进制值一定会把原二进制值右起的第一个1变成0,而这个1右边的所有0都会变成1,再进行按位与运算的话,就会把n二进制中右起第一个1去掉,同时也会把n-1二进制刚刚增加的1也变成0,所以相对n来说,n&n-1就会少了右起第一个1。
所以如果我们如果进行如下运算:
while (n) { n = n & n - 1; }
每一次循环,都会消掉最右边的1,直到所有1都消去,所以只要再弄个变量计数,就能统计n二进制中1的个数。
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt = 0;
while (n) {
cnt++;
n = n & (n-1);
}
return cnt;
}
};