Java 中的位图/位板

Bitmaps/bitboards in Java

提问人:Radoslav Khun 提问时间:5/18/2023 更新时间:5/18/2023 访问量:62

问:

我正在用 Java 编写一个国际象棋引擎,我想在一个称为位图或位板的变量中表示所有棋子的位置。在C++中,我会简单地使用无符号的长整型,或所谓的uint64_t。但是因为 Java 中没有无符号变量(据我所知),那么什么是有效的方法,如何实现这种方法?

我尝试了我能想到的一切

Java 无符号 位板

评论

2赞 John Bollinger 5/18/2023
您可以使用 Java 类型,其宽度为 64 位。它是一个有符号整数类型在 C 或 C++ 中是一个问题,但在 Java 中应该不会出现问题。例如,在 Java 中定义良好。long1L << 63
0赞 John Bollinger 5/18/2023
旁注:Java 中有一个无符号基元类型:是一个 16 位无符号整数。我不认为这对你有帮助。char
2赞 zapl 5/18/2023
还有一些像 BitSet 这样的类可以在您的目标是更轻松的时候提供帮助。如果您想将内存空间保持在最低限度,最好使用有时略显笨拙的位操作。例如,请记住,java 会自动扩展到完整的 32 位 int0xFF
1赞 aled 5/18/2023
你真的在做位运算吗?否则,应使用更能表示问题域的对象。Java 中的工具比 C 语言中的工具更多,例如对象、枚举。
0赞 Basil Bourque 5/18/2023
就像@aled建议的那样......Java 中的枚举比大多数其他语言中的枚举更强大、更灵活。Java 中的枚举可以具有状态(成员字段)、构造函数和方法。因此,每个方格的每个枚举对象都可以存储其颜色,并存储位于其上的部分(如果您愿意的话)。&可以非常有效地存储枚举对象的集合。EnumSetEnumMap

答:

3赞 Louis Wasserman 5/18/2023 #1

符号性实际上与使用数字作为位掩码并没有显著区别——至少在 Java 中是这样。

你可以使用一个刚刚好,即使它是签名的。 工程。请注意,当您向右移动面罩时,您将需要使用而不是 to。long1L << 63>>>>>

请注意,如果要存储超过 64 位,则不妨使用 ,它专门设计为可根据需要缩放的位图。java.util.BitSet