三种方式查找二进制中一的个数

第一种的方法是 %2 ,/2法

//三种方式实现查找二进制中一的个数

//第一种 %2 ,/2 型
int findone(unsigned int a)
{
    int count = 0;
    while (a)
    {
        if (a % 2 == 1);
        {
            count++;
        }
        a /= 2;
    }
    return count;
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int c = findone(a);
    printf("%d", c);
    return 0;
}

这里举两个例子,4的二进制后几位为0100,在除二得到1时,上面1%2就等于1,count就会加加,然后1/2 = 0;循环停止

再如6的二进制为0110,6/2变3时,3%2 == 1,count就++,然后3/2 == 1,1%2 == 1,count++,最后1/2 == 0;循环停下,return count。

要注意,这里要将接收变量a的类型写成unsigned int ,如果是写个int,这里负数就不能实现查找。

第二种方法是 利用右移操作符 >> 和 位操作符&

//第二种,利用 右移操作符>>与1比较
int findone(unsigned int a)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; i++)
    {
        if ((a >> i) & 1 == 1)
        {
            count++;
        }
    }
    return count;
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int c = findone(a);
    printf("%d", c);
    return 0;
}
这里利用了右移操作符 >> 和位操作符&,&的原理是对应的二进制位有0则为0,只有同时为1,才为1,所以这里就可以不断 比较,右移,比较。从而实现找到一的个数。

第三种方法 是利用公式a & (a-1) ,这个公式也可以判断某个数是不是2的次方

//第三种  利用a&(a-1) 
int findone(unsigned int a)
{
    int count = 0;
    while (a)
    {
        a = a & (a - 1);
        count++;
    }
    return count;
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int c = findone(a);
    printf("%d", c);
    return 0;
}

这里每执行一次a&(a-1),就会少一个一,例子如下:

设a = 5  -> 0101,a - 1 = 4  ->  0100

a & (a-1) = 0100  ->4

a -1 = 3 -> 0011  

a & (a-1) = 0;

这里可以很容易地看出,执行了两次a&(a-1),a的值就为0了,所以count= 2;也就是5的二进制中的1的个数(unsigned int的作用与第一个方法中的相同),这里就不再写例子了,可以自行算一下就会懂了。

以上的二进制都没有补完32位出来!

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值