有多少个1?
1、题目内容
Description
计算机中存储的整数都是按补码的型式,一个32位有符号整数的补码的定义为:如果x>=0,则x的补码等于x的二进制表示;如果x<0,那么x的补码为2^32+x的二进制表示。请根据给定的整数,求出它的补码包含有多少位为1。
输入
每行一个样例,为一个整数(可以用int表示)。
输出
每行输出一个对应样例的结果。
Sample Input
1
0
-1
Sample Output
1
0
32
2、题目分析
这个题目主要就是考察了二进制的换算,当x为正数的时候,补码直接就是它的二进制,但是如果为负数的话,那么要将x先加上一个2的32次方,然后再求它的二进制,即为负数的补码。但是需要注意的是,由于输入的数可能会比较大,所以我们需要将数据类型定义为最大的超长整型才可以,不然就会因为溢出然后求错。
3、参考代码
#include<stdio.h>
int main()
{
long long x;
while(scanf("%I64d",&x)!=EOF)
{
long long count=0;
if(x<0) //如果x小于0,则需要加上2的32次方
{
x=x+ 4294967296;
}
while(x!=0)
{
if(x%2==1)
{
count++;
}
x/=2;
}
printf("%I64d\n",count);
}
return 0;
}