Поскольку многие из существующих ответов указывают на детали реализации Java и вывода отладки, давайте посмотрим на математику двоичного умножения, чтобы действительно ответить, почему.
Комментарий @kasperd идет в правильном направлении. Предположим, вы умножаете не непосредственно на число, а на простые множители этого числа. Чем много чисел будет иметь 2 в качестве простого множителя. В двоичном формате это равно сдвигу влево. По коммутативности мы можем сначала умножить на простые множители 2. Это означает, что мы просто делаем сдвиг влево.
Если взглянуть на двоичные правила умножения, единственный случай, когда 1 приведет к определенной позиции цифры, - это когда оба значения операнда равны единице.
Таким образом, эффект сдвига влево заключается в том, что позиция самого младшего бита 1 при дальнейшем умножении результата увеличивается.
Поскольку целое число содержит только биты самого младшего порядка, все они будут установлены в 0, когда в результате достаточно часто используется простой множитель 2.
Обратите внимание, что представление дополнения до двух не представляет интереса для этого анализа, так как знак результата умножения может быть вычислен независимо от полученного числа. Это означает, что если значение переполняется и становится отрицательным, биты младшего разряда представляются как 1, но во время умножения они снова обрабатываются как 0.