首页 > 解决方案 > 了解使用无符号位板生成滑动块移动的“o^(o-2r)”公式?

问题描述

我正在尝试做什么 我正在 尝试执行一些按位运算来创建一个国际象棋引擎。为了制作这个引擎,我需要能够生成棋子的移动,比如车。有一个方便的公式可以创建一个可让车移动到的方块位板:bitboardOfOccupiedSquares ^ (bitboardOfOccupiedSquares - 2 * bitboardOfPieceToMove).

考虑以下棋盘位置:在此处输入图像描述

我正在尝试生成 h1 上的车可以移动到的所有方格。所以这应该很容易,我只需抓住占据方格 ( 18410433801713942527) 的位板并抓住 h1 上的车的位板 (2^63 或9223372036854775808) 并将它们代入方程:

let bitboardOfOccupiedSquares: UInt64 = 18410433801713942527
let bitboardOfPieceToMove: UInt64 = 9223372036854775808
let bitboardOfSquaresPieceCanMoveTo: UInt64 = bitboardOfOccupiedSquares ^ (bitboardOfOccupiedSquares - 2 * bitboardOfPieceToMove)

的问题我面临的问题是没有bitboardOfOccupiedSquares大于的值,所以当作为 的值传递时2 * (2^63),操作(bitboardOfOccupiedSquares - 2 * bitboardOfPieceToMove)总是产生一个负数。当然,负数不能用无符号整数表示,所以每当 h1 上的一块被传递时,程序就会在我身上崩溃。2^63bitboardOfPieceToMove

我已经看到一个 youtuber 通过在 Java 中使用有符号整数来完成此方法(如此此处所见)。我曾尝试在整个引擎中使用签名位板而不是未签名位板,但这只会导致其他问题在其他地方出现。另外,我知道大多数引擎都可以毫无问题地使用未签名的位板。

此外,2 * (2^63)equals18446744073709551616高于 的UInt64最大值18446744073709551615,我认为这与整个“2s 补码”的想法有关。

我想知道 国际象棋引擎编程世界中是否有人使用过这个o^(o-2r)公式,尤其是未签名的位板?我能够掌握文章和 youtube 视频中传达的想法,但似乎无法使其在未签名位板的实践中发挥作用。

标签: swift64-bitchessuint64bitboard

解决方案


推荐阅读