剑指Offer: 二进制中1的个数
题目描述
输入一个32位整数,输出该数二进制表示中1的个数。
样例1
输入:9
输出:2
解释:9的二进制表示是1001,一共有2个1
样例2
输入:-2
输出:31
解释:-2在计算机里会被表示成11111111111111111111111111111110,
一共有31个1
算法1 位运算
- 末尾有1,计数器自增
- 将待统计的数值n,右移1位,继续统计末尾是否有1
- 负数处理:在C++中如果我们右移一个负整数,系统会自动在最高位补1,这样会导致 n 永远不为0,就死循环了。解决办法是把 n 强制转化成无符号整型,这样 n 的二进制表示不会发生改变,但在右移时系统会自动在最高位补0
时空分析
时间复杂度分析: 每次会将 n 除以2,最多会除 logn 次,所以时间复杂度是 O(logn)
C++ 代码
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
unsigned int num = n;
while(num)
{
if (num & 0x1)
{
count++;
}
num >>= 1;
}
return count;
}
};