((a<<16)/b)
предоставит вам 16-битную дробную часть деления.
Это легче увидеть в базе 10: если мы хотим найти первые три дробные цифры, скажем, 5/3, мы можем переместить 5 трех мест над (5000), разделите их на 3, затем возьмите последние три целых цифры. 5000/3 - 1666, поэтому первые три цифры после десятичного числа 5/3 равны .666.
Это работает, потому что «перемещение 5 одну цифру над» такой же, как «умножения на 10», и умножение/деление коммутируют (порядок можно поменять местами вокруг), поэтому (5 * 1000)/3
= (5/3) * 1000
= 1.6666... * 1000
= 1666.666...
,
Другими словами, сдвиг 5 на несколько цифр и деление на 3 совпадает с сдвигом (5/3) на пару цифр.
Я бы сказал, что это хуже, чем бесполезно, с 'O', требующим 32/16-битного деления! Установка «O» на оставшуюся часть была бы более полезной и упростила бы арифметику с несколькими точками. –