【问题标题】:Bitboard: counting elements with neighboursBitboard:用邻居计算元素
【发布时间】:2018-03-20 05:45:49
【问题描述】:

为了表示 2D 棋盘游戏的状态,我使用带有 16 位无符号整数的 bitboards。状态编码为 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

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

【问题讨论】:

    标签: bit-manipulation bitboard


    【解决方案1】:

    获取一个设置了位的掩码 IFF 它上面有一块和一些相邻的块(即有一块直接在左边,或在右边,或向上,或向下,或对角线):

    mask = board & (left(board) | right(board) | up(board) | down(board) |
                    left(up(board)) | left(down(board)) |
                    right(up(board)) | right(down(board)))
    

    那就数一数吧。

    关键显然是董事会“轮班”的实施,但它们真的很简单。您选择的方向在位方面的含义可能会有所不同,具体取决于您在板中打包位的顺序。例如,对于 4x4 板以某种似乎有意义的顺序包装:

    left(board)  = (board & 0x7777) << 1
    right(board) = (board & 0xEEEE) >> 1
    up(board)    = board << 4
    down(board)  = board >> 4
    

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2014-02-05
      • 1970-01-01
      • 2021-11-14
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多