解释
位棋盘 用一个64位数字表示国际象棋棋盘上的一组格子。位是一种只能取0或1的信息单位。由于棋盘有64格,可以为每个格子分配一位。
白兵掩码
每格一个比特
固定的本地约定:按横线读取指示位,先从 到 ,再从 到 ,依次直到 和 。1表示该格属于集合。所示白兵集合:00000000/00000000/00000000/00000000/00000000/00101000/10000001/00000000。行棋方及其他FEN数据不属于此掩码。
值为1并不总是表示格子上有棋子,而是表示该格属于这个位棋盘所描述的集合。一个位棋盘可以标记全部白兵、某匹马攻击的每个格子、所有被占据的格子,或任何其他有用的集合。
马攻击掩码
没有棋子的置位
沿用相同的横线顺序约定。所示集合为 白马攻击的格子:00000000/00000000/00101000/01000100/00000000/01000100/00101000/00000000。即使这些格子上没有棋子,这些置位仍描述一种几何属性。
通常会同时维护多个位棋盘。按位运算直接组合0和1,可以用很少的处理器指令求集合交集、并集、移除格子或移动模式,从而支持快速生成着法和攻击。
攻击与占据的交集
A与B的交集结果
按照已声明的横线顺序约定,A是 白车攻击的格子集合,B是黑色棋子占据的格子集合。所示集合为A与B的交集:00000000/00000000/00000000/00010000/00000000/00000000/00000000/00000001。有效比特对应 和 。 黑王属于B,但不属于A。
单个位棋盘本身不保存什么
- 每一种棋子类型,除非由其他位棋盘提供这种区分。
- 轮到哪一方走棋。
- 权,也就是王与车的特殊着法是否仍被允许,以及吃过路兵是否可用,也就是兵能否进行这种特殊吃法。
一个完整局面会把这些事实与多个集合结合起来。位棋盘也不是 一类搜索方法,而是一种信息表示方式。
常见混淆
位棋盘与完整棋盘状态
一个位棋盘通常只描述一组格子。完整局面会把多个集合与其他状态信息结合起来。
位棋盘与位库
位棋盘表示一个局面中的格子,位库则保存许多残局局面的结果。
查看术语来源
- 1.Bitboards, Chess Programming Wiki
- 2.bitboard.h, Stockfish
