题目不需要多讲了吧
题目:请实现一个函数,输入一个整数,输出该数二进制中表示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这样这个解法就这么神奇的解决的第二个解法的小弊端
祝您越学越快乐