swift - 了解使用无符号位板生成滑动块移动的“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^63
bitboardOfPieceToMove
我已经看到一个 youtuber 通过在 Java 中使用有符号整数来完成此方法(如此处和此处所见)。我曾尝试在整个引擎中使用签名位板而不是未签名位板,但这只会导致其他问题在其他地方出现。另外,我知道大多数引擎都可以毫无问题地使用未签名的位板。
此外,2 * (2^63)
equals18446744073709551616
高于 的UInt64
最大值18446744073709551615
,我认为这与整个“2s 补码”的想法有关。
我想知道
国际象棋引擎编程世界中是否有人使用过这个o^(o-2r)
公式,尤其是未签名的位板?我能够掌握文章和 youtube 视频中传达的想法,但似乎无法使其在未签名位板的实践中发挥作用。
解决方案
推荐阅读
- kubernetes - Access web server inside a pod in a vm from outside the VM
- c# - In ASP.net, what kind of IF statement could I use to hide a div if the image inside it matches the current page URL?
- android - Limiting the number of loaded items in memory with paging library
- cassandra - system.log 中的墓碑扫描
- ios - UITableViewCell detailTextLabel white space
- excel - Change tab colour based on cell value, runtime error
- python - cmd 和 bat 行为不同
- apache-spark - DynamicFrame 解决 Array 和 Struct 之间的选择
- imagemagick - 在png透明度内设置图像
- android - 将人脸匹配图像发送到 Android 上的 AWS Rekognition 时出错