我正在寻找创建一个基本的国际象棋(或失败,跳棋/选秀)引擎。在研究了这个主题之后,我非常有信心想要使用一系列的位板。我在基本层面理解这个概念,但我在用Java表示它们时遇到了麻烦。
我试图将棋盘的白色部分表示为1,其他所有部分使用long表示为0:
long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L;
但是当我打印出来时,我得到以下46位:
System.out.println(Long.toBinaryString(whitePieces));
1001001001001001001001001001001001001001001001
导致此结果的原因是什么?我确信这里有一些我从根本上误解的东西;如果有人能指出我正确的方向,我将非常感激。
答案 0 :(得分:9)
在你的前面添加0b
,说它是二进制数。
long whitePieces = 0b0000000000000000000000000000000000000000000000001111111111111111L;
^^
(Java {7}中引入了0b
前缀。如果您使用的是旧版本,则可以执行Long.parseLong("000...111", 2)
)
另一种方法:如何创建枚举:
enum ChessPiece { Pawn, Knight, ... };
并将电路板存储在ChessPiece[8][8]
中。这应该为您提供一个更清晰的界面来读取和修改状态,而不是一堆long
给你的。
如果您关注性能,只需将实际表示正确地封装在Board
类中(使实际数据结构保密)。如果您稍后发现ChessPiece[8][8]
已成为瓶颈,您可以在不费吹灰之力的情况下将其更改为long
。
答案 1 :(得分:0)
您不会存储二进制数字,而是存储十进制数字。要使用二进制表示法创建数字,您需要在其前面添加0b
。请参阅Oracle docs on binary literals。
此外,单个棋盘或棋盘只能用一个比特来代表,所以你可能想要重新考虑你的解决方案。