これは難読化された 8 倍の方法です。したがって、(y << 3) + x
は に等しくなり8 * y + x
ます。
8 を掛けることy << 3
と同等である理由<<
は、 が左シフト演算子であるためです。これは、左のすべてのビットをy
1 桁シフトします。基数 10 の数値を左に 1 桁シフトすると 10 を掛けることができるのと同じように、基数 2 を左にシフトすることは 2 を掛けることと同じです。したがって、左に 3 桁シフトすることは、 2 * 2 * 2 = 8. 一般に、n
位置を左にシフトすることは、乗算することと同じ2^n
です (左端からビットが落ちない限り)。
昔、プログラマーはこのようなコードを書きました。なぜなら、左シフトは非常に高速で、乗算よりも高速であり8 * y
、y << 3
. しかし、最近では、コンパイラ8 * y
はy << 3
.
したがって、意図をより明確に表現しているため、難読化されていると言います8 * y
。 の意図は、8 のブロックで(y << 3) + x
スキップし、そのブロックで th の位置を取ることです。そして、これはと言うとより明確に表現されます。人間がコードを読んで理解できるように、高水準言語でコーディングしていることを忘れないでください。私たちのコードは人間のために書かれるべきです。コンパイラは、マシンが理解できるように適切なマシン命令を作成するという仕事を行うことができます。y
x
8 * y + x
pieceCodes
これは、1D 配列にマップされたばかりの 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
しかし、このように見えるふりをすることができます
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
の番目の列、番目の行に(x, y) -> 8y + x
アクセスするとします。つまり、スキップする 8 のブロックの数と、そのブロック内のどこに移動するかを示します。x
y
piecesCode
y
x