/** * Преобразуем в строку. Часть 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; }