题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)
解题思路:
- 要求结果为统计二进制数中1的个数,那么我就每次让其中的一个1变为0,然后统计次数,直到所有的1变为0为止。
- 要实现每次让其中的1个1变为0可以利用&运算, n &= n-1 (n为传入的二进制数)
- 要让代码一直执行直到所有的0变为1,可以利用while(n) ;当n 中1的都变为0时停止循环
下面实战开始!
代码讲解:
var hammingWeight = function(n) {}
首先定义一个函数;参数n为需要传入的二进制数。
var sum = 0;
用来统计二进制数中1的个数。
while(n){
n &= n-1;
sum++
}
while(n):当n为真(true)时while会一直执行,直到n为假(false)时才停止;所以当n的所有1都变为0时,才会终止。
n &= n-1:很多人会对这句代码不理解,说明你对&运算不了解,希望下面的代码对你有所帮助,若还不理解,建议百度一下。
式子n&=(n-1)同理为n=n&(n-1)
&表示“与”,例如n=11110 ,则n-1=11101
相与之后:11100
n&(n-1)所表示的含义为:将最后一位1变成0
然后统计循环的次数也就是1的个数:
sum++ :每次循环加1;统计1的个数
最后把需要的结果sum return出去就可以了
return sum
下面对代码进行测试:
测试代码:
var hammingWeight = function(n) {
var sum = 0;
while(n){
n &= n-1;
sum++
}
return sum
};
var str = 011101;
console.log(hammingWeight(str))
测试结果为 :4 ;答案正确。
*注意:你测试的二进制数要以0开头,不然会默认为十进制的数;或者你把它转化为二进制数
本次文章到这里也就结束了,解题的方法不唯一,这只是其中的一种,还有更多的方法等着你去探索,若有错误之处,还请见谅并指出,谢谢!