【问题标题】:Javascript bitwise logic in a for loopfor循环中的Javascript按位逻辑
【发布时间】:2014-01-05 23:47:03
【问题描述】:

我一直在努力改进我的 Javascript,并且一直在经历 Coderbyte 的挑战。剩下的唯一一个我似乎无法完美破解的简单挑战被称为“Array Addition 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] 输出应该返回真,因为 4 + 6 + 10 + 3 = 23. 数组不会为空,不会包含所有相同的元素,并且可能包含负数。

【问题讨论】:

  • 该代码的作者使用它来获取元素的所有排列
  • 谢谢,所以我假设(但不确定) l 代表数组中元素的所有逻辑组合。我不明白的是它是如何在 if 语句中用作布尔条件的。例如,0 & 64 = true 还是 false?
  • 当您检查位集时 - 您检查该数字是否不假。所以如果它是0 - 它被视为false,否则true。检查10 &amp; (1 &lt;&lt; 0)10 &amp; (1 &lt;&lt; 1)

标签: javascript bitwise-operators


【解决方案1】:

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

解释:

假设我们有 4 个元素:

  1. 外循环遍历0..15
  2. 内部循环检查i 的特定位是否设置i &amp; (1 &lt;&lt; j)
  3. 如果已设置 - 累加总和
  4. 在我们遍历所有位之后 - 检查总和是否等于预期

PS:cnt &gt; 1 需要检查 sum 创建的多个数字不是一个

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多