版权声明:欢迎交流,本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42513339/article/details/88929540
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
这题实际上不难,难点在于负数,对于负数的1个数,笔者是加了标志位来判断的,但是本人竟然记反了二进制除2取数的顺序,顺序取反就导致debug了快一个小时,也算是找到自己的弱点。
代码如下:
class Solution {
public:
int NumberOf1(int n) {
if(n == 0)
return 0;
int count =0;
if(n > 0)
{
while(n != 0)
{
if(n%2 == 1)
count ++;
n /= 2;
}
}
else
{
int m = -n;
int flagCount = 0;//flagCount是负数补码末端 1 的个数
bool once = true;//这里如果补码末端是 0 ,则不计数,最后直接加 1 即可
while(m != 0)
{
if(m%2 == 1)
{
count++;
once = false;
}
else
{
if(once)
flagCount++;
}
m /= 2;
}
count = 32 - count -(flagCount-1);
}
return count;
}
};