七周打卡剑指offer《二进制中1的个数》

Posted JunMain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七周打卡剑指offer《二进制中1的个数》相关的知识,希望对你有一定的参考价值。

题目描述

输入一个 32 位整数,输出该数二进制表示中 1 的个数。

注意:

负数在计算机中用其绝对值的补码来表示。

样例

样例1
输入:9
输出:2
解释:9的二进制表示是1001,一共有2个1。
样例2
输入:-2
输出:31
解释:-2在计算机里会被表示成11111111111111111111111111111110,
      一共有31个1。

题解

lowbit(x) 是求出一个数二进制中最右边一个1的数 x & -x
注意负数的补码 = 反码 + 1
例如
5 = ( 0101 ) 2 (0 101)_2 (0101)2
-5 = ( 1011 ) 2 (1 011)_2 (1011)2
-5 & 5 = 1
每一次x - lowbit(x) 直到最后等于0就是 x中1的个数

代码

class Solution 
public:
    int lowbit(int x)
        return x & -x;
    
    int NumberOf1(int n) 
        int cnt = 0;
        while(n)
            n -= lowbit(n);
            cnt++;
        
        return cnt;
    
;

以上是关于七周打卡剑指offer《二进制中1的个数》的主要内容,如果未能解决你的问题,请参考以下文章

七周打卡剑指Offer《找出数组中重复的数》

七周打卡剑指offer《旋转数组中最小的数字》

七周打卡剑指offer《 删除链表中重复的节点》

七周打卡剑指offer《 删除链表中重复的节点》

七周打卡剑指offer《剪绳子》

七周打卡剑指offer《剪绳子》