一点上下文,当我试图解决 javascript 问题以找到所有可能的子集时,我正在查看另一个 SO 帖子。我不是在问 JS 挑战,而是为什么会有它,它有什么数学意义?
这是来自this SO post 的代码的复制粘贴
var arr = [1, 2, 3];
function generatePowerSet(array) {
var result = [];
result.push([]);
for (var i = 1; i < Math.pow(2, array.length); i++, result.push(subset))
for (var j = 0, subset = []; j < array.length; j++)
if (i & Math.pow(2, j))
subset.push(array[j]);
return result;
}
console.log(generatePowerSet(arr));
我不明白 if (i & Math.pow(2, j))
完成了什么线。 mozilla doc表示它对每个位对执行 AND 比较。为什么相关?
当我说相关时,我的意思是,例如使用 LEFT SHIFT,做 << 1 乘以 2。如果a << b
,它的等效数学函数乘以二b 是 1
.我不明白什么数学函数&
在这种情况下。
最佳答案
表达式 i & Math.pow(2, j)
在 i 中的第 j 位为非零值时1(从最低有效位开始计算,即第 0 位)。
这可以通过示例得到最好的解释。假设 i 在某个时刻是 10;在二进制中:1010。现在让 j 为 0。然后:
i & Math.pow(2, j)
== 10 & Math.pow(2, 0)
== 10 & 1
== 0b1010 & 0b0001
== 0b0000
第二个值 (0b0001) 的作用是过滤:它正好从第一个值中过滤掉一位。看看当 j 为 1 时会发生什么:
i & Math.pow(2, j)
== 10 & Math.pow(2, 1)
== 10 & 2
== 0b1010 & 0b0010
== 0b0010
因此 if
条件对于 j 的值将为真。
由于 i 有两个 1 位,if
条件对于 i 的特定值将有两次为真。
关于javascript - 按位与(&)运算符的数学函数是什么(JS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47802087/