В простейшем случае (учитывая, что цифры пронумерованы от LSB до MSB, первая - 0) И, зная старую цифру, мы могли бы сделать так просто:
num += (new_digit - old_digit) * 10**pos;
Для реальной задачи нам понадобится:
1) MSB-первая версия pos
, которая может стоить вам log()
или максимум log10(MAX_INT)
делений на десять (может быть улучшено с помощью бинарного поиска).
2) цифра от того pos
, для которого потребуется не более 2 делений (или ноль, используя результаты шага 1).
Вы также можете использовать специальную инструкцию fpu из x86, которая способна сохранить число с плавающей запятой в BCD (я понятия не имею, насколько оно медленное).
ОБНОВЛЕНИЕ: первый шаг можно сделать еще быстрее, без делений, с помощью бинарного поиска, подобного этому:
int my_log10(unsigned short n){
// short: 0.. 64k -> 1.. 5 digits
if (n < 1000){ // 1..3
if (n < 10) return 1;
if (n < 100) return 2;
return 3;
} else { // 4..5
if (n < 10000) return 4;
return 5;
}
}