Умножение и деление используя сдвиги, как это работает?
не надо всё смешивать в одну кучу mul и shr. рассмотрим сдвиги:
представим например число 1 в двоичном исчислении 8 бит: 00000001.
что будет если сдвинуть биты влево?  - что в десятичной системе будет 2.
ещё сдвинем влево - получится  00000100 - в десятичной это 4.
вот получается и умножение при сдвиге влево. а при сдвиге вправо - деление
4 * 10 = 40. Переводим в шестнадцатиричную систему, получаем 0x28.
40 / 2 = 20. Переводим в шестнадцатиричную систему, получаем 0x14.