Day22 算法题-31题:计算32位整型数二进制表示中1的个数

36 阅读1分钟

题目描述:

输入一个整型数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:

QQ截图20230322202548.png

-1

-111111.png

最小整型数-2147483648:

-256464.png