最近买了一本《Javascript基础教程(第7版)》,看到下面这段代码的时候不太理解,书上的《按位运算详解》能看懂,但是不理解setSquares = setSquares | Math.pow(2,i)是如何得出当前状态的二进制代码的。setSquares一开始不是被赋值0了吗,拿0和2的i次方做或计算能得出什么呢?还有,后面为什么要拿当前状态的二进制代码跟获胜组合做与计算,再把计算结果与获胜组合比较,从而确定是否为获胜组合呢?前面说过561624不在获胜列表中,但是跟557328(一个获胜者)做与计算之后,把结果再跟557328比较,怎么又变成获胜者了呢?window.onload = initAll;
var usedNums = new Array(76);function initAll() {
    if (document.getElementById) {
        document.getElementById("reload").onclick = anotherCard;
        newCard();
    }
    else {
        alert("Sorry, your browser doesn't support this script");
    }
}function newCard() {
    for (var i=0; i<24; i++) {
        setSquare(i);
    }
}function setSquare(thisSquare) {
    var currSquare = "square" + thisSquare;
    var colPlace = new Array(0,1,2,3,4,0,1,2,3, 4,0,1,3,4,0,1,2,3,4,0,1,2,3,4);    
    var colBasis = colPlace[thisSquare] * 15;
    var newNum;    do {
        newNum = colBasis + getNewNum() + 1;
    }
    while (usedNums[newNum]);    usedNums[newNum] = true;
    document.getElementById(currSquare).innerHTML = newNum;
    document.getElementById(currSquare).className = "";
    document.getElementById(currSquare).onmousedown = toggleColor;
}function getNewNum() {
    return Math.floor(Math.random() * 15);
}function anotherCard() {
    for (var i=1; i<usedNums.length; i++) {
        usedNums[i] = false;
    }    newCard();
    return false;
}function toggleColor(evt) {
    if (evt) {
        var thisSquare = evt.target;
    }
    else {
        var thisSquare = window.event.srcElement;
    }
    if (thisSquare.className == "") {
        thisSquare.className = "pickedBG";
    }
    else {
        thisSquare.className = "";
    }
    checkWin();
}function checkWin() {
    var winningOption = -1;
    var setSquares = 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;
        if (document.getElementById(currSquare).className != "") {
            document.getElementById(currSquare).className = "pickedBG";
            setSquares = setSquares | Math.pow(2,i);
        }
    }    for (var i=0; i<winners.length; i++) {
        if ((winners[i] & setSquares) == winners[i]) {
            winningOption = i;
        }
    }
    
    if (winningOption > -1) {
        for (var i=0; i<24; i++) {
            if (winners[winningOption] & Math.pow(2,i)) {
                currSquare = "square" + i;
                document.getElementById(currSquare).className = "winningBG";
            }
        }
    }
}