我正在研究这段代码,我不明白这行是做什么的: [(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)
这是一种模糊的乘以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 * y用y << 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列,第一y行piecesCode.也就是说,y告诉我们要跳过多少8个块,并x告诉我们在该块内的哪个位置.
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |