for循环中的Javascript按位逻辑

时间:2013-12-18 00:13:08

标签: javascript bitwise-operators

我一直在努力改进我的Javascript并且一直在经历Coderbyte的挑战。我似乎无法完美破解的唯一容易的挑战称为“阵列加法1”*。我正在尝试将我的代码与另一位获得完美回复的用户进行比较:

function ArrayAdditionI(arr) { 

  for (var i = 0; i < arr.length; i++) {
    arr[i] = parseInt(arr[i], 10);
  }

  var max = arr[0];
  for (var i = 1; i < arr.length; i++) {
    max = Math.max(max, arr[i]);
  }
  //everything above makes sense
  for (var i = 0, l = 1 << arr.length; i < l; i++) {
    var s = 0, cnt = 0;
    for (var j = 0; j < arr.length; j++) {
      if (i & (1 << j)) {
        s += arr[j];
        cnt++;
      }
    }

    if (cnt > 1 && s == max) {
      return true;
    }
  }

  return false;       
}

ArrayAdditionI(/* some array*/)        

有人可以帮忙解释上面如何使用按位运算符的简单英语解释吗?

[*]

  

让函数ArrayAdditionI(arr)获取存储的数字数组   在arr中,如果中的任何数字组合,则返回字符串true   数组可以加到等于数组中的最大数字,   否则返回字符串false。例如:如果arr包含[4,6,   23,10,1,3]输出应该返回true,因为4 + 6 + 10 + 3 =   23.数组不会为空,不包含所有相同的元素,并且可能包含负数。

1 个答案:

答案 0 :(得分:1)

使用该代码创建元素的所有排列。

说明:

假设我们有4个元素:

  1. 外循环遍历0..15
  2. 内部循环检查i的特定位是否设置为i & (1 << j)
  3. 如果已设置 - 累计总和
  4. 在我们迭代所有位之后 - 检查sum是否等于预期的
  5. PS:cnt > 1需要检查该总和是否创建多个数字而不是一个

    PPS:一次迭代的详细解释。

    让我们想象一下当前i = 101010二进制文件)。

    因此,当我们执行嵌套循环时 - 我们将检查是否只设置了第2和第4位,这意味着我们将尝试对数组的第2和第4个元素求和。然后检查它们的总和是否等于最大值。