题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路:
- 针对正数,将该数对2取余,当余数是1时进行加1,再将该数除以2,循环进行
- 针对负数,可考虑先将其转换为正数 ,其转换规则为其原码等于其补码取反再加1
例如:已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。
二、实现代码
class Solution {
public:
int NumberOf1(int n) {
int a,b,num=0;
unsigned int number = n;
//对负数取其对应的正数
if(n<0){
number = ~(-n)+1;
}
while(number>0){
if(number%2)
num++;
number = number/2;
}
return num;
}
};