-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目描述:
-
输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
-
输出:
-
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
这道题拿过来第一想法就是按照手动算法一步一步来,可是写到后来觉得很麻烦,然后想到可以利用位运算,这道题就解决啦。这里有几点要注意:
1. 对于int ,左移补0,右移补符号位。
2. 想要得到数的每一位,有下面几种写法
int j=0;
while(x)
{
a[j++]=x&1;
x>>=1;
}
这种方法有两个问题,首先你得到的是反序,需要有对调的过程,当然这不是最重要的,如果是正数,可以正常结束,没有问题,如果是负数,右移补1,则会死循环。
或者
int j=0;
for(i=0;i<32;i++)
{
a[j++]=x&1;
x>>=1;
}
这个解决 了死循环,但是还是要反序,当然以上两种办法都改变了x这个数本身。
比较好的是这种方法
for(i=31;i>=0;i--)
{
if(x&(1<<i))cout<<"1";
else cout<<"0";
}
x没动,只是左移1,而且不用反序,比较好的解决了三个问题。