Java- for循环使用<<运算符

use*_*410 3 java

我正在研究这段代码,我不明白这行是做什么的: [(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));   
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

jas*_*son 6

这是一种模糊的乘以8的方式.因此,(y << 3) + x等于8 * y + x.

其原因y << 3是相当于乘以8是因为<<是左移位运算符:它转移的所有位y由一个位置向左 同样地,如果你取一个基数为10的数字并向左移一个位置你乘以10,那么在基数2中向左移动相当于乘以2.因此,向左移动三个位置相当于乘以2*2*2 = 8.通常,左移n位置相当于乘以2^n(只要你没有从左端掉落的位).

在过去,程序员编写了这样的代码,因为左移是超级快速,比乘法更快,所以8 * y不是最优y << 3.但这些天,编译器在搞清楚何时需要更换像不错8 * yy << 3.

因此,我说它是混淆的,因为8 * y更明确地表达了意图:意图(y << 3) + x是跳过y8块,并取得该块中的x第th个位置.这是很多更清楚地表示说8 * y + x.请记住,我们使用高级语言编写代码来阅读和理解代码.我们的代码应该为人类编写.编译器可以完成其为机器制作良好机器指令的工作.

它是这样做的,因为它试图假装这pieceCodes是一个2D数组,只是映射到一维数组.

就是piecesCode这样

x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
Run Code Online (Sandbox Code Playgroud)

但我们可以假装它看起来像这样

x x x x x x x x 
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
Run Code Online (Sandbox Code Playgroud)

看,(x, y) -> 8y + x我们访问第xth列,第一ypiecesCode.也就是说,y告诉我们要跳过多少8个块,并x告诉我们在该块内的哪个位置.

  • 我已经够老了它没有混淆:( (4认同)
  • 它不一定是混淆的. (3认同)
  • 我说它没有混淆,因为每个软件工程师都应该像二进制系统一样熟悉二进制系统.例如,通过将"y << 3"更改为"y << 4"而不是将"8*y"更改为"16*y"来调整相关数组的大小更为自然.那是因为8和16是写下两个**轮**数的非常尴尬的方式. (3认同)
  • @Ian,我和你在Go董事会. (2认同)