如何在一个数字的二进制表示中找到数字1的数量?

4

从其他搜索中,我发现这个问题被称为“汉明重量”或“种群计数”。有很多答案给出了许多统计数据,但我需要以简单的方式找到解决方案。复杂性并不是一个大问题。在JavaScript中是否有像Java的Integer.bitCount一样的内置函数?

我目前的做法如下。

var binary = 3;
var original = binary;
var count = 0;
while(binary>0)
{
    binary = binary >> 1 << 1;
    if(original-binary==1)
        count++;
    original = binary >> 1;
    binary = original;
}

有没有更好的、更简单、更优雅的方法来实现这个功能?


3
如果它确实是一个字符串,则为str.split('1').length,但那根本不是JavaScript,而是Java。 - adeneo
与代码审查相关(http://codereview.stackexchange.com/questions) - Govind Singh
然后就是 numb.toString().split('1').length,哒哒! - adeneo
以上方法的时间复杂度高吗?我应该选择哪个? - Foreever
你所发布的代码不是JavaScript,而你又要求JavaScript,这让人很难理解你真正想要什么。建议使用JavaScript代替你所用的语言。 - adeneo
显示剩余2条评论
5个回答

6

试试这个

var binary = 10;
var result = binary.toString(2); //Converts to binary
var count = result.split(1);//  count -1 is your answer
alert((result.split('1').length-1));

可以写成

(binary.toString(2).split('1').length-1)

toString(2)  : helps to split it in a base2 format which is binary, can do this in a range of 2- 36 (iam not sure about the range) 

3
如果您想在二进制表示中计算1的位数,我们可以使用如下的正则表达式。

number.toString(2).match(/1/g).length


请注意,这个正则表达式可以帮助您快速准确地计算出二进制数字中1的数量。

2

一种不使用内置函数的简单方法:

function f(n){
    let i = 0;
    do if(n&1) ++i; while(n>>=1)
    return i;
}

// example:
console.log(f(7)); // 3

这似乎对于大数值会失败(例如,8224580541325813 应该产生 28,但是这个函数却产生了 17)。这是因为右移操作将假定您的数字只是一个32位数字,并截断超出该范围的任何内容。 - Bronzdragon

1
  function numOfOnes(n) {
    if(n === 0) return n;
    return (n & 1) + numOfOnes(n >>= 1);
  }

这种方法基本上是递归调用的。
当没有数字要评估时,它具有基本条件。
否则,它会在 (n >>= 1) 上调用自身,并将最后一位 (n & 1) 添加到结果中。
例如,7 的二进制表示为 111 = 1+1+1 = 3
17 的二进制表示为 10001 = 1+0+0+0+1 = 2


好的回答,但是解释一下它是如何以及为什么能够工作会使得这个回答更加优秀。 - PhonicUK

0

function countOnesInDecimal(num) {
  let count = 0;
  let binary = num.toString(2);
  const splitted = binary.split('');
  for (const iterator of splitted) {
    if (iterator === `1`) {
      count += 1;
    }
  }

  return count;
}
console.log(countOnesInDecimal(3));


不需要拆分字符串,您可以轻松地遍历字符串而不是数组。 - BlobKat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接