在 Python 中将位板中的位向左移动的问题
Problem with moving bits in the bitboard to the left in Python
我正在编写国际象棋 AI。当我想将位从 king_span 移到左侧时,我 运行 遇到了问题。当我将位移动到 45 个位置时,它工作正常。如果我想将它们移动超过 45 个位置,输出的位板是相同的,就好像它只移动了 45 个位置一样。为什么它不再移动它们了,我怎么可能解决这个问题?我必须为此制作第二个 king_span 吗?
感谢您的帮助。
king_span = int("0000000000000000000000000000000000000000000001110000010100000111", 2)
def print_bitboard(bitboard):
board = '{:064b}'.format(bitboard)
for i in range(8):
print(board[8 * i + 0] + " " + board[8 * i + 1] + " " + board[8 * i + 2] + " " + board[8 * i + 3] + " " + board[
8 * i + 4] + " " + board[8 * i + 5] + " " + board[8 * i + 6] + " " + board[8 * i + 7])
print_bitboard(king_span << 45)
输出:
1 1 1 0 0 0 0 0
1 0 1 0 0 0 0 0
1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
--> 比特不再移动。下一个位板应如下所示:
1 1 0 0 0 0 0 0--> this bit gets deleted to zero
0 1 0 0 0 0 0 0--> this bit gets deleted to zero too
1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
您的初始数字是 1110000010100000111
- 这意味着您的数字中有 19 个有效位。
当您将位向左移动 45 个二进制步时,您最终得到一个具有 45 + 19 = 64
有效数字的数字:
1110000010100000111000000000000000000000000000000000000000000000
如果您移动超过 45 步,您将得到超过 64 位数字。假设你移动了 61 步;您的最终结果将有 80 位数字:
new_number = king_span << 61
print('{:b}'.format(new_number))
这将打印
11100000101000001110000000000000000000000000000000000000000000000000000000000000
由于您的 for
循环仅打印 8 行 8 位数字,这意味着您仅打印 64 位数字。你有更多;在此示例中,您有 80 位数字。剩下的数字只是没有被打印出来。
我正在编写国际象棋 AI。当我想将位从 king_span 移到左侧时,我 运行 遇到了问题。当我将位移动到 45 个位置时,它工作正常。如果我想将它们移动超过 45 个位置,输出的位板是相同的,就好像它只移动了 45 个位置一样。为什么它不再移动它们了,我怎么可能解决这个问题?我必须为此制作第二个 king_span 吗?
感谢您的帮助。
king_span = int("0000000000000000000000000000000000000000000001110000010100000111", 2)
def print_bitboard(bitboard):
board = '{:064b}'.format(bitboard)
for i in range(8):
print(board[8 * i + 0] + " " + board[8 * i + 1] + " " + board[8 * i + 2] + " " + board[8 * i + 3] + " " + board[
8 * i + 4] + " " + board[8 * i + 5] + " " + board[8 * i + 6] + " " + board[8 * i + 7])
print_bitboard(king_span << 45)
输出:
1 1 1 0 0 0 0 0
1 0 1 0 0 0 0 0
1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
--> 比特不再移动。下一个位板应如下所示:
1 1 0 0 0 0 0 0--> this bit gets deleted to zero
0 1 0 0 0 0 0 0--> this bit gets deleted to zero too
1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
您的初始数字是 1110000010100000111
- 这意味着您的数字中有 19 个有效位。
当您将位向左移动 45 个二进制步时,您最终得到一个具有 45 + 19 = 64
有效数字的数字:
1110000010100000111000000000000000000000000000000000000000000000
如果您移动超过 45 步,您将得到超过 64 位数字。假设你移动了 61 步;您的最终结果将有 80 位数字:
new_number = king_span << 61
print('{:b}'.format(new_number))
这将打印
11100000101000001110000000000000000000000000000000000000000000000000000000000000
由于您的 for
循环仅打印 8 行 8 位数字,这意味着您仅打印 64 位数字。你有更多;在此示例中,您有 80 位数字。剩下的数字只是没有被打印出来。