1059 有多少个1?

有多少个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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42987451/article/details/83503122