/**
 * Преобразуем в строку. Часть 1. Целые числа.
 * http://we.easyelectronics.ru/Soft/preobrazuem-v-stroku-chast-1-celye-chisla.html
 */

/* 5. Деление на 10 сдвигами и сложениями. */
struct divmod10_t {
    uint32_t quot;
    uint8_t rem;
};

inline static divmod10_t divmodu10(uint32_t n) {
  divmod10_t res;
// умножаем на 0.8
  res.quot = n >> 1;
  res.quot += res.quot >> 1;
  res.quot += res.quot >> 4;
  res.quot += res.quot >> 8;
  res.quot += res.quot >> 16;
  uint32_t qq = res.quot;
// делим на 8
  res.quot >>= 3;
// вычисляем остаток
  res.rem = uint8_t(n - ((res.quot << 1) + (qq & ~7ul)));
// корректируем остаток и частное
  if(res.rem > 9) {
    res.rem -= 10;
    res.quot++;
  }
  return res;
}

char * utoa_fast_div(uint32_t value, char *buffer) {
  buffer += 11;
  *--buffer = 0;
  do {
    divmod10_t res = divmodu10(value);
    *--buffer = res.rem + '0';
    value = res.quot;
  } while (value != 0);
  return buffer;
}
