基础知识
按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:
3&5即 0000 0011 & 0000 0101 = 0000 0001因此,3&5的值得1。
按位与运算符(|)
参加运算的两个数据,按二进制位进行“或”运算。
运算规则:1|1=1;1|0=1;0|1=1;0|0=0;
即:只要对应的二个二进位有一个为1时,结果位就为1
例如:
9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13
实现思路
棋盘描述
以BingoCard为例:
棋盘上共25个格子,抛弃free还有24个,即将每个格子定义下标0~23;
格子下标 | 十进制 | 二进制 |
---|---|---|
0 | 2^0 | 000000000000000000000001 |
1 | 2^1 | 000000000000000000000010 |
…… | …… | …… |
22 | 2^22 | 010000000000000000000000 |
23 | 2^23 | 100000000000000000000000 |
由上表易见,格子[i]转换为2^i的二进制,就是第(i+1)位上是1,那么假如我格子[0]和格子[1]同时被使用了,用二进制如何表示?
2^0|2^1=000000000000000000000011
通过或运算,实现了每使用一个格子就把对应位上的数字变成1,如此就可以用二进制描述棋盘了。
胜利判断
假如胜利条件为格子[0]和格子[1]同时被使用,当前棋盘上格子[0]、格子[1]、格子[22]与格子[23]都被使用了,我们该如何判定胜利呢?
先将胜利条件描述出来:
2^0|2^1=000000000000000000000011
再将战场情况描述出来
2^0|2^1|2^22|2^23=110000000000000000000011
与运算
110000000000000000000011
&000000000000000000000011
=000000000000000000000011
可见,如果战场描述中存在胜利情况,将胜利情况与当前战场与运算,就会返回胜利情况,所以,我们只需要将战场描述和胜利情况进行与运算,如果返回胜利情况,那就是胜利了。
JavaScript代码
function checkWin(){
var winningOption = -1;
var setSqares=0;
var winners= new Array(31,992,15360,507904,541729,557328,1083458,2162820,4329736,8519745,8659472,16252928);
for(var i=0;i<24;i++)
{
var currSquare = "square"+i
thisSquare=document.getElementById(currSquare);
if(thisSquare.className!=""){
thisSquare.className=="pickedBG";
setSqares=setSqares|Math.pow(2,i);
}
}
for(var i=0;i<winners.length;i++)
{
if((winners[i]&setSqares)==winners[i]){
document.getElementById("winnertip").innerHTML = "YOU WIN";
break;
}
}
}
实例:
BingoCard:http://logicforeach.net/bingocard/index.html思路源于JavaScript基础教程(第九版)