二进制中一的个数

题目不需要多讲了吧

题目:请实现一个函数,输入一个整数,输出该数二进制中表示1的个数,例如,9的二进制表示为1001,有两位是1,如果输入9,这该函数输出2

关于二进制中一的个数

一共有三种解法(前面第一种会有bug)

第二种第三种(第三种最为高效)

首先说我们会想到的第一种方法

也就是用位于运算法

把输入的数用右移运算符和1做与运算&

如果该数的最右边一位是1则&运算结果为1反之则0

下面写代码

第一种会出现一些bug

    我们先来复习一下位移运算符

      如果一个数向左移<<则每一位向左移动一位 最右边那位用0补齐

      如果右移>>则最左边那位有两种情况

          第一 , 当该数为无符号数 最右边用0补齐

          第二,当该数为有符号数 最右边用符号位补齐(这里就会出现当该数为负数是右边一直补齐                              1出现死循环)

 

该如何解决这个问题呢

我们可以了解问题的本质再结合解决问题的方法

    如果移动输入数不行那我们移动另一个数(也就是1)

    我们把1右移就可以避免上面出现的问题这种方法就没有bug了

老板上代码

这个解法已经很好了

不过宝藏博主可能不能让我的小伙伴们就这样打住

下面上让面试官眼睛发亮的解法

上面的解法需要循环32次

那怎么能让我们的循环有多少个一就循环多少次呢

下面这个解法希望小伙伴们记住以后能够举一反三

n&(n-1)

这是一个神奇的东西

我们把这两个数&上会发现最右边的一位1被与掉了

这是因为当n-1时他的最低为1会被转为0最低位的右边位都会变为1

直接给客官上栗子

12这个数1100

                减去1变1011

1100

1011然就就变1000这样这个解法就这么神奇的解决的第二个解法的小弊端

祝您越学越快乐

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值