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