我正在学习此代码,但我不明白此行的作用:[(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()而不是==

10-07 23:35