我正在寻找解释为什么Javascript中的代码有效。
理念如下:
* 273 84
* \ /
* 1 | 2 | 4 = 7
* -----+-----+-----
* 8 | 16 | 32 = 56
* -----+-----+-----
* 64 | 128 | 256 = 448
* =================
* 73 146 292
每次玩家设置他的数字时,该字段的数量都会添加到他的分数中。 该领域的数字是胜利。
现在有这个检查:
wins = [7, 56, 448, 73, 146, 292, 273, 84],
win = function (score) {
var i;
for (i = 0; i < wins.length; i += 1) {
if ((wins[i] & score) === wins[i]) {
return true;
}
}
return false;
},
现在我不明白:如果玩家在字段中设置数字(字段中的数字,顺序事项)1,16,4,2,那么他的得分为23.代码如何知道即使他没有得分7,他仍然连续3次? (这是最上面的一行)因为代码只将得分与胜利进行比较,而23则不是胜利!
答案 0 :(得分:1)
算法不只是使用简单的数学来计算胜利。它使用按位运算执行位掩码来检查胜利。
每个方块都有不同的位值(从电路板的右上角开始):
1 = 000000001
2 = 000000010
4 = 000000100
...
9 = 100000000
然后添加获胜的方块以获得获胜组合:
7 = 000000111
56 = 000111000
448 = 111000000
...
然后我们可以使用你设置的1,16,4,2的例子:
23 = 0000001111
当我们使用按位和操作来检查它具有的获胜组合时:
000001111 (23)
& 000000111 (7)
---------
000000111 (7)
您可以看到结果与获胜组合相同,这是您的算法正在检查的内容。
答案 1 :(得分:0)
它没有与数字进行比较,而是比较了哪些比特被设置。行wins[i] & score === wins[i]
表示它正在比较wins [i]和得分[wins]之间的任何常见位。
以下是使用您在问题中的值1,16,4,2。
的示例1 = 1
2 = 10
4 = 100
7 = 111
16 = 10000
因此,如果您选择了所有这些字段,它是10111二进制,将其与7进行比较,翻转的公共位是111(7),因此它知道有一个胜利,因为这三个都已设置。