如何用C语言实现统计一个数二进制中1的个数

提供给大家三种方法,三种解题思路;

方法三 优于 方法二 优于 方法一 

  • 方法一

我们很容易想到一种方法来依次得到这个数的最后一位,当时是以十进制的形式来实现的,在这类比在二进制上似乎同样适用,我们来试一试。

在十进制中我们是这样实现的,123 % 10 = 3                         123 / 10 = 12

                                                   ......

分别可以得到末尾的数字,我们类似的用二进制,就是/2   ,    %2  分别实现。

主函数

函数实现

我们运行结果发现,似乎有些小问题只有输入无符号整数时满足

要想有符号整数也适用,我们可以转化其,用无符号来接受

比如-1的补码是111111111

用无符号来接受,原码也就是11111111;

我们实验一下

成功,思路比较简单

  • 方法二

第二种方法与第一种方法有相似之处,既然我们学习了>>和<<操作符,那么得到最后一位的数字,就可以用输入数字右移相应的位数在&1

如果这一位是0,那么得到的就是0;

如果这一位是1,那么得到的就是1;

借助for循环我们可以轻松实现

  • 方法三

第三种方法我们不容易想到

n=n&(n-1)

接下来我们充分理解这个式子

假设n=15,即为1111

1111 & 1110 = 1110

1110 & 1101 = 1100

1100 & 1011 = 1000

1000 & 0111 = 0000

如上,我们发现执行几次,就能将最右边几位1变成0

函数实现

非常巧妙的实现了我们的目的

这来自一道谷歌的笔试题,让我们对简单的算法也有了更深的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值