最近买了一本《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";
}
}
}
}
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";
}
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货