javascript - 按位与(&)运算符的数学函数是什么(JS)?

标签 javascript bitwise-operators

一点上下文,当我试图解决 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/

相关文章:

javascript - onRequestPermissionsResult 没有扩展

java - 处理按位或失败

javascript - ~ JavaScript 中的按位运算符

javascript - Div 的动态定位

javascript - 使用已加载脚本的功能

javascript - JQueries Live 在 IE8 中工作吗?

c++ - -Wconversion warning while using operator <<= on unsigned char

javascript - for 循环在解析云代码上的奇怪且令人惊讶的行为。

java - 什么是按位运算?

swift - swift 中的按位和算术运算