题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
A1:判断数num的最右边一位是不是1,每次右移1位,直到数num变为0 ====> 要区分正数情况和负数情况,正数右移补0,负数右移补1
A2:避免死循环,不选择右移数num,而是左移flag ====> 循环次数比较大,32位整数需要循环32次
A3:把数num减去1,再和原整数做位与运算。一个整数的二进制中有多少个1就可以进行多少次这样的运算
(1)Q1:可不可以把右移一位改成除以2?
A1:不可以,除法的效率比移位要低很多,实际编程中应尽可能用移位运算符代替乘除法
(2)A2:把负数0x80000000右移1位是0xC0000000
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(n & flag)
{
count++;
}
flag = flag << 1;
}
return count;
}
};

class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while(n)
{
n = (n - 1) & n;
count++;
}
return count;
}
};

相关题目:
进制转换:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出
bit count:输入一个long类型的数值, 求该数值的二进制表示中的1的个数
UTF-8编码验证:给定一个表示数据的整数数组,返回它是否为有效的 utf-8 编码
原文:https://www.cnblogs.com/xiexinbei0318/p/11415670.html