位板:与邻居计数元素

时间:2018-03-19 14:02:19

标签: bit-manipulation bitboard

为了表示2D棋盘游戏的状态,我使用16位无符号整数的位板。状态编码为1表示片段存在,0表示其他。

水平,垂直或对角地计算至少有一个相邻作品的件数的位板方法是什么?

我发现的算法(非常简化)是:

total = 0
for each bitIndex in bitscanForward(bitboard)
    total += bitPopCount(bitboard & (ADJACENT_MASK << bitIndex))
return total
  • bitScanForward函数返回第一位的索引并将其设置为0
  • bitPopCount函数返回位数

唯一的限制是电路板是m行x m列,m <= 8。

有没有办法在不循环比特的情况下实现这一目标?

1 个答案:

答案 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