我正在学习此代码,但我不明白此行的作用:[(y << 3) + x]
for (int y = 0; y <= 7; ++y) {
for (int x = 0; x <= 7; ++x) {
final String pieceCode = pieceCodes[(y << 3) + x];
if (pieceCode.length() != 2) throw new IllegalArgumentException();
if (!pieceCode.equals("--")) {
pieces[((7 - y) << 3) + x] = CheckersPiece.valueOf(pieceCode.charAt(0), pieceCode.charAt(1));
}
}
}
最佳答案
(y << 3)
表示向左移3次。它等于乘以2 ^ 3 =8。因此,整个表达式(y << 3) + x
变为y * 8 + x
。
应该以y * 8 + x
的形式编写,因为它更具可读性,并且很可能不会提高性能。 Premature optimization is the root of all evil。最好将此类微优化留给编译器(或JVM)。
此外,电路板的大小可以存储在一个常数中,以仅在一个位置存储:
final int SIZE = 8;
// ...
for (int y = 0; y < SIZE; y++) {
for (int x = 0; x < SIZE; x++) {
final String pieceCode = pieceCodes[y * SIZE + x];
y * 8 + x
只是在(逻辑上)具有8行和列,存储为1D,具有64个单元格的2D表上进行迭代。最后,我想指出的是,在给定的代码中
pieceCodes
是一个字符串数组。但实际上,它是一个片段代码数组。不只是一些字符串。现在,
"--"
处于某种魔术状态,除程序员外,没人知道它的含义。 if (pieceCode.length() != 2)
也看起来很糟糕。因此,应该有一个对象PieceCode
,并且数组将声明为PieceCode[] pieceCodes
。在PieceCode
中,我们可以实现适当的equals()
方法。如果PieceCode
仅是一个状态,则它可以是一个Enum。例如EMPTY, WHITE_PAWN, WHITE_QUEEN, BLACK_PAWN, BLACK_QUEEN
。比较字符串不如比较枚举那么快。我们还必须注意编写equals()
而不是==
。