为了表示2D棋盘游戏的状态,我使用16位无符号整数的位板。状态编码为1表示片段存在,0表示其他。
水平,垂直或对角地计算至少有一个相邻作品的件数的位板方法是什么?
我发现的算法(非常简化)是:
total = 0
for each bitIndex in bitscanForward(bitboard)
total += bitPopCount(bitboard & (ADJACENT_MASK << bitIndex))
return total
唯一的限制是电路板是m行x m列,m <= 8。
有没有办法在不循环比特的情况下实现这一目标?
答案 0 :(得分:0)
获得一个有点设置的面具IFF它上面有一块和一些相邻的块(即有一块直接在左边,或右边,或向上,向下,或对角线):
mask = board & (left(board) | right(board) | up(board) | down(board) |
left(up(board)) | left(down(board)) |
right(up(board)) | right(down(board)))
然后算一算。
关键显然是董事会的实施&#34;转移&#34;,但它们非常简单。您选择的方向在位方面的含义可能会有所不同,具体取决于您在电路板中打包位的顺序。例如,4x4板以某种顺序包装似乎有意义:
left(board) = (board & 0x7777) << 1
right(board) = (board & 0xEEEE) >> 1
up(board) = board << 4
down(board) = board >> 4