面试题15:二进制中1的个数

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

解析:有两个解法:第一种是类似于独热的扫描,从右到左扫描,当扫描到当前位为 1 就给计数器加一。第二种是从右到左依次把 1 变成 0,这里用到的一个技巧是 n \& (n-1) 可以把 n 的二进制表示中的最右边的 1 变成 0。变一次就给计数器加一。


答案:

int NumberOf1_Solution1(int n)
{
    int cnt = 0, flag = 1;

    while (flag) //flag 左移 31 次之后,再左移就变成 0 了
    {
        if (n&flag) ++cnt;
        flag <<= 1;
    }
    return cnt;
}

int NumberOf1_Solution2(int n)
{
    int count = 0;

    while (n)//n 中最左边的那个 1 被消除之后,n 就变成了 0
    {
        ++count;
        n &= n-1; //将 n 的最右边的 1 变成 0
    }

    return count;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容