Javascript 按位掩码

Javascript bitwise mask

有没有人试图得到一个数字的二进制 'components'?

我想做的是:

我有数字:5,所以二进制是0101。我正在尝试找到可以给我们 5 的数字的总和。显然我知道它是 1 和 4( 0001 和 0100 )但我无法想出通过代码获得它的方法。

MDN 有关于位运算符的好文章,但仍然没有乐趣。

var number = 5, 
    result = [];

for(var i = 1; i <= number; i = i << 1) {
  if(i & number) {
    result.push(i & number);
  }
}

console.log(result);

循环使用移位(i << 1 将数字乘以 2,以 2 的幂(1、2、4、8...)递增 i,您也可以执行 i *= 2) 并使用按位与 (&) 检查原始数字是否设置了该位。如果是这样,它会将其作为数字添加到结果数组中。

您可以使用带有基数参数的 Number.prototype.toString

var number = 5;
number.toString(2); // -> "101"

如果您需要数字本身,您可以使用 Number 拆分该字符串和映射。

number.toString(2).split("").map(Number); // -> [1, 0, 1]

如果您不想先将其存储为变量,请务必将数字括在括号中。

5.toString(2).split("").map(Number); // -> SyntaxError
(5).toString(2).split("").map(Number); // -> [1, 0, 1]

这是一个基于生成器的解决方案,它将产生一系列的 1 或 0:

const bits = *(n) => { do yield n & 1; while (n >>= 1); };

> console.log(Array.from(bits(5));
< [1, 0, 1]

然后,如果您愿意,您可以将结果乘以相应的 2 的幂,和/或过滤掉零。