求一个无符号整数二进制形式中1的个数(三种方法)

题目:

输入一个整数,输出这个整数二进制形式中1的个数。

例如:

输入:115

输出:5

解题思路:

方法一:

关键代码:i = i & (i-1),统计i二进制中有多少个1 

具体是如何实现的,实际推几步就可以看出规律。例如2017的二进制形式为11111100001

第一步,11111100001 & 11111100000 = 11111100000    count = 1

第二步,11111100000 & 11111011111 = 11111000000     count = 2

......

每一步结果都会减少一个二进制中的1,并且计数加一,实际上是在统计二进制中1的个数。

方法二:

要求一个数的二进制形式中1的个数,那么首先想到的是求其二进制。常用的方法为除二取余法,当得到的余数为1时,计数加一,从而实现题目要求。

方法三:

根据题目的要求,我想到了逐位去判断是否为1,若是的话则计数加一。那么就需要用到位运算的知识,我们知道1按位与上一个数不改变这个位,0按位与上一个数将这个位零。那么我只需将1不停左移并按位与上要判断的数每一位,就可以得到这个数二进制形式中1的个数。

程序代码:

方法一:

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    while(num){
    num = (num)&(num-1);
    count++;}
    return count;
}

方法二: 

#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    while(num){
    if(num % 2 == 1){
    count++;
    }
    num = num / 2;
    }
    return count;
}

方法三: 

#include <stdio.h>
int return_1(unsigned int );
int main(int argc, char *argv[])
{ 
    unsigned int num = 0;
    printf("请输入一个整形数据:");
    scanf("%u",&num);
    printf("该数据二进制中1的个数为:%d\n",return_1(num));
    return 0;
} 
int return_1(unsigned int num)
{
    int count = 0;
    int i = 0;
    while(i++ < 32)
    if(((1 << i) & num) != 0)
        count++;
    return count;
}

运行结果:

请输入一个整形数据:643698459
该数据二进制中1的个数为:16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值