如何正确使用位板
How to properly use bitboards
我想知道在国际象棋引擎中实现位板的正确方法是什么。到目前为止,我对国际象棋引擎编程的基础知识进行了一些研究并做了一些笔记,主要是诸如 minimax、alphabeta、静态搜索和高级评估函数等内容。
然后我将我的项目分成 3 个部分,它们是:
- 图形界面
- 董事会代表
- 实现超越 minimax 的搜索,并为静态位置提供合适的评估函数
我使用位板来表示棋盘状态,以在表示棋盘和计算游戏树时节省时间。这就是我的问题所在。
因为我不只是想复制别人的代码,所以我尝试创建一个 unsigned long
来测试它,但显然丢失了一点。
代码如下:
public static void main(String[] args) {
Long bitBoard = Long.parseUnsignedLong("9223372036854775807");
System.out.println("Number of bits in this 64-bit unsigned long: " + Long.bitCount(bitBoard));
System.out.println(Long.MAX_VALUE);
}
谁能告诉我我做错了什么,为什么我输了一点?
在java中,Long
总是有符号的,第一位(你丢失的)决定它是正数还是负数。 Long.parseUnsignedLong(...)
只会确保您传递的值是正数,不会实际将数据类型转换为无符号长整型。
编辑:没关系。上述说法是错误的。您遇到的问题是您对带符号的 Long 使用了最大值。 unsigned long 的最大值是 18446744073709551615
.
我想知道在国际象棋引擎中实现位板的正确方法是什么。到目前为止,我对国际象棋引擎编程的基础知识进行了一些研究并做了一些笔记,主要是诸如 minimax、alphabeta、静态搜索和高级评估函数等内容。
然后我将我的项目分成 3 个部分,它们是:
- 图形界面
- 董事会代表
- 实现超越 minimax 的搜索,并为静态位置提供合适的评估函数
我使用位板来表示棋盘状态,以在表示棋盘和计算游戏树时节省时间。这就是我的问题所在。
因为我不只是想复制别人的代码,所以我尝试创建一个 unsigned long
来测试它,但显然丢失了一点。
代码如下:
public static void main(String[] args) {
Long bitBoard = Long.parseUnsignedLong("9223372036854775807");
System.out.println("Number of bits in this 64-bit unsigned long: " + Long.bitCount(bitBoard));
System.out.println(Long.MAX_VALUE);
}
谁能告诉我我做错了什么,为什么我输了一点?
在java中,Long
总是有符号的,第一位(你丢失的)决定它是正数还是负数。 Long.parseUnsignedLong(...)
只会确保您传递的值是正数,不会实际将数据类型转换为无符号长整型。
编辑:没关系。上述说法是错误的。您遇到的问题是您对带符号的 Long 使用了最大值。 unsigned long 的最大值是 18446744073709551615
.