Что я пытаюсь сделать Я пытаюсь выполнить побитовые операции для создания шахматного движка. Чтобы сделать этот движок, я должен быть в состоянии генерировать ходы для фигур, таких как грачи. Существует удобная формула для создания битборда квадратов, доступных для перемещения ладьи: 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)
всегда выдает отрицательное число при передаче 2^63
в качестве значения для bitboardOfPieceToMove
. Конечно, отрицательные числа не могут быть представлены целыми числами без знака, поэтому программа вылетает на меня всякий раз, когда передается кусок на h1.
Я видел, как youtuber выполнил sh этот метод, используя подписанный целых чисел в Java (как видно здесь и здесь ). Я пытался использовать подписанные битборды вместо неподписанных битбордов в моем движке, но это просто вызывает другие проблемы, возникающие в других местах. Кроме того, я знаю, что большинство двигателей используют беззнаковые битборды без проблем.
Кроме того, 2 * (2^63)
равняется 18446744073709551616
, что на единицу выше UInt64
max 18446744073709551615
Я полагаю, что это связано с идеей «дополнения 2s».
Что я интересуюсь Кто-нибудь в мире программирования для шахматного движка работал с этой формулой o^(o-2r)
, особенно с неподписанными битбордами? Я могу воплотить идеи, изложенные в статье и видео на YouTube, но не могу заставить ее работать на практике с неподписанными битбордами.