华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/9/30
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解析:一个整数在计算机中是32位,最高位是符号位。由于负数右移的时候是在坐标补1。所以判断第31位是否为1,然后对整数左移。不管负数正数左移右面都是补0。
class Solution {
public:
int NumberOf1(int n)
{
int result = n < 0;
int p = 1 << 30;
for (int i = 0; i < 31;i++)
{
result += (n & (p)) == p;
n = n << 1;
}
return result;
}
};
当然有更高效的解法,来省掉很多为0的循环。
无论正负,若不为0,直接找到最后一个1将其删除。
class Solution
{
public:
int NumberOf1(int n)
{
int count = 0;
while (n != 0)
{
++count;
n = (n - 1) & n;
cout<<n<<endl;
}
return count;
}
};