时间限制: 1秒 空间限制: 32768K
本题知识点: 进制转化 补码反码原码
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路分析
当n>=0时,循环除以2,然后记录余数中1的个数
当n<0时,定义一个32位的数组表示二进制数,然后求反码,求补码,然后数1的个数
C#语言
public int NumberOf1(int n)
{
int count = 0;
if (n >= 0)
{
while (n > 0)
{
if (n % 2 == 1) ++count;
n = n >> 1;
}
}
else
{
int[] array = new int[32];//array存储负数二进制
array[0] = 1;//第一位为符号位
int m = -n, index = 31;
//原码
while (m > 0)
{
if (m % 2 == 1) array[index] = 1;
m = m >> 1;
--index;
}
//反码
for (int i = 1; i < array.Length; ++i)
{
array[i] = array[i] == 1 ? 0 : 1;
}
bool jw = false;//是否要进位
//补码
for (int i = array.Length - 1; i >= 1; --i)
{
if (jw || i == array.Length - 1) ++array[i];
if (array[i] < 2) jw = false;
else
{
array[i] = 0;
jw = true;
}
if (array[i] == 1) ++count;
}
count += 1;//符号位为1,所以+1
}
return count;
}