На самом деле вы знаете, как это работает, по математике в начальной школе.
Умножение в двоичном формате в 10 раз проще, чем десятичное.
Если у меня есть двоичное число abcd, где a, b, c, d - каждый отдельный бит, либо один, либо ноль каждый. И я хочу умножить это на 5 десятичных, что является двоичным 0b101.
abcd
* 0101
=========
и заполнить его, длинное умножение, если вы будете
abcd
* 0101
=========
abcd
0000
abcd
+ 0000
=========
двоичное, делает это проще, потому что либо вы добавляетев сдвинутой версии числа или вы добавляете ноль для каждого шага.
Вы также можете использовать другую начальную школу по математике
x * 5 = x * (2 ^ 2 + 2 ^ 0) = (x * 2 ^ 2) + (x * 2 ^ 0) = (x * 4) + x = (x << 2) + x </p>
В вашем случае:
16385d = 0x4001 = 0x0100000000000001 = (1 << 14) + (1 << 0) </p>