一点背景知识,当我试图解决 javascript 问题以找到所有可能的子集时,我正在查看另一篇 SO 帖子。我不是在问 JS 挑战,而是问它为什么存在以及它有什么数学意义?
这是代码的复制粘贴这个帖子
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 文档表示它对每个位对执行 AND 比较。为什么它是相关的?
当我说相关时,我的意思是,例如使用左移,执行 a a << bb 是1
。看不懂什么数学函数&
在这种情况下确实如此。
The expression i & Math.pow(2, j)
gives a non-zero value when the jth bit in i is 1 (counting from the least significant bit, which is the 0th bit).
这可以通过示例得到最好的解释。比方说i某一时刻为10;二进制:1010。现在让j为 0。则:
i & Math.pow(2, j)
== 10 & Math.pow(2, 0)
== 10 & 1
== 0b1010 & 0b0001
== 0b0000
第二个值 (0b0001) 的作用是过滤:它从第一个值中过滤掉一位。看看什么时候会发生什么j is 1:
i & Math.pow(2, j)
== 10 & Math.pow(2, 1)
== 10 & 2
== 0b1010 & 0b0010
== 0b0010
The if
因此,对于这个值,条件为真j.
As i有两个 1 位,将出现两次if
对于该特定值,条件为真i.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)