Это нечитаемом способ умножения на 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
это пропустить по y
блоков 8, и занять позицию x
-й в этом блоке. И это много более четко выражено выражением 8 * y + x
. Помните, мы кодируем языки высокого уровня для людей, чтобы читать и понимать код. Наш код должен быть написан для людей. Компилятор может выполнять свою работу по созданию хороших машинных инструкций для понимания машиной.
Это делается так, потому что он пытается притвориться, что pieceCodes
- это 2D-массив, который просто отображается в 1D-массив.
То есть, 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
мы доступ к x
-й столбец, y
-й строки piecesCode
. То есть y
сообщает нам, сколько блоков из 8 пропустить, а x
рассказывает нам, куда идти в этом блоке.
[Побитовое и смещение операторов резюме] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html) – BackSlash
Похоже, что это индексирование в 2D-массив, хранящийся в одном массиве. –
@DaveNewton Я думаю, что это он! – user2520410