Такое ещё придумал, можно знаменатель 2-ой дроби не константой.
Обобщается для любой системы счисления, если есть запас для одного
разряда при умножении. Но при этом: 32 итерации × (2 сравнения + 2
сдвига с присвоением + ИЛИ с присвоением + вычитание с присвоением.
) Как сравнить быстродействие с библиотечным вариантом? 10К значений прогнать на целевой платформе и засечь время? Это если нет таймера со скоростью ядра.
uint32_t frac_convert( uint32_t val, uint32_t fullrange)
{
uint32_t ret = 0;
uint32_t dig_1 = (1 << (32-1)); // most significant bit
while( dig_1 != 0) {
val = val << 1;
if ( val >= fullrange ) {
ret |= dig_1;
val -= fullrange;
}
dig_1 = dig_1 >> 1;
}
return ret;
}