剑指offer:面试题15. 二进制中1的个数

题目:二进制中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;
    }
};
发布了106 篇原创文章 · 获赞 113 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_41598072/article/details/104408177