Понимание формулы "o ^ (o-2r)" для генерации движений скользящих фигур с использованием беззнаковых битбордов? - PullRequest
1 голос
/ 11 марта 2020

Что я пытаюсь сделать Я пытаюсь выполнить побитовые операции для создания шахматного движка. Чтобы сделать этот движок, я должен быть в состоянии генерировать ходы для фигур, таких как грачи. Существует удобная формула для создания битборда квадратов, доступных для перемещения ладьи: bitboardOfOccupiedSquares ^ (bitboardOfOccupiedSquares - 2 * bitboardOfPieceToMove).

Рассмотрим следующую позицию шахматной доски: enter image description here

Я пытаюсь сгенерировать все квадраты, по которым ладья на 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, но не могу заставить ее работать на практике с неподписанными битбордами.

...