【发布时间】: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 & (1 << 0)和10 & (1 << 1)
标签: javascript bitwise-operators