如何使用 table 查找和 XOR 计算二进制中的 1?

How to count 1s in binary using table lookup and XOR?

我需要计算一个整数的二进制表示形式中 1 的个数。 这两个要求是:

1) 必须使用 table 查找 2) 必须使用异或按位运算符

到目前为止,我认为我有一个可行的 table 查询:

const generateLookupTable = (int) => {
  const range = Array.from({length: int}, (x,i) => i);
  const toBinary = (table, i) => {
    const binary = (i >>> 0).toString(2);
    table[i] = binary;
    return table;
  }

  const lookupTable = range.reduce(toBinary, {})
  return lookupTable;
};

这会打印出如下内容:

generateLookupTable(7)
{0: "0", 1: "1", 2: "10", 3: "11", 4: "100", 5: "101", 6: "110"}

我对如何使用 XOR 来解决这个问题感到困惑(或者为什么我什至会使用查找 table)。我觉得我可以通过将 int 转换为二进制然后循环遍历每个字符并总结我看到的 1 来轻松解决这个问题。然而,要求使它变得困难。

这只是部分提示,但对于评论来说太长了。你可以用异或做的一件事是找到最右边的 1。然后你可以减去它并在保持计数的同时再做一次。这会告诉你一个数字中有多少个::

function countOnes(n) {
    let count = 0
    while(n > 0) {
        n -= n ^ (n & (n -1))
        count++
    }
    return count
}

let n = 1709891;
console.log(countOnes(n))
console.log(n.toString(2))

n = 7
console.log(countOnes(n))
console.log(n.toString(2))

n = 9
console.log(countOnes(n))
console.log(n.toString(2))

也许这有点帮助。不确定后面的说明是什么。