题目描述:
输入一个整型数n,输出该数的32位二进制表示中1的个数。其中负数用补码表示。
数据范围:-2147483648 ≤n≤ 2147483647
示例1:
输入:
10
返回值:
2
说明:
10
的32位二进制表示为:0000 0000 0000 0000 0000 0000 0000 1010
其中有2个1
示例2:
输入:
-1
返回值:
32
说明:
-1
采用补码表示,-1的32位二进制表示为:1111 1111 1111 1111 1111 1111 1111 1111
其中有32个1
思路:
因为1的二进制数只有最后一位是1,n若为正值,则
n&1==1
表示n的最后一位二进制数为1,若等于0的话则说明最后一位为0;每次比完后让n右移一位,再进行对比,一直到右移到n==0
结束,采用变量result每次和结果相加就可以得到1的个数。对于负值,采用对n按位取反
n=~n;
再调用上述过程,最后返回结果为 32-result;
#include <stdio.h>
//day22-计算整数n的二进制表示中1的个数,负数由补码表示
int Count_of1(int n) //计算1的个数
{
int result = 0;
while(n!=0)
{
result += n&1;
n = n>>1;
}
return result;
}
int CountOf_1(int n)
{
if(n==0) return 0;//若是0直接返回
if(n>0){
int i = Count_of1(n);//调用函数
return i;
}
if(n<0)
{
n = ~n; //负数的话先按位取反再调用
int i = Count_of1(n);//调用函数
return 32-i;
}
}
int main() {
int n;
scanf("%d",&n);
int i = CountOf_1(n);
printf("%d\n",i);
return 0;
}
输出结果:
10:
-1
最小整型数-2147483648: