itoa.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /**
  2. * Преобразуем в строку. Часть 1. Целые числа.
  3. * http://we.easyelectronics.ru/Soft/preobrazuem-v-stroku-chast-1-celye-chisla.html
  4. */
  5. /* 5. Деление на 10 сдвигами и сложениями. */
  6. struct divmod10_t {
  7. uint32_t quot;
  8. uint8_t rem;
  9. };
  10. inline static divmod10_t divmodu10(uint32_t n) {
  11. divmod10_t res;
  12. // умножаем на 0.8
  13. res.quot = n >> 1;
  14. res.quot += res.quot >> 1;
  15. res.quot += res.quot >> 4;
  16. res.quot += res.quot >> 8;
  17. res.quot += res.quot >> 16;
  18. uint32_t qq = res.quot;
  19. // делим на 8
  20. res.quot >>= 3;
  21. // вычисляем остаток
  22. res.rem = uint8_t(n - ((res.quot << 1) + (qq & ~7ul)));
  23. // корректируем остаток и частное
  24. if(res.rem > 9) {
  25. res.rem -= 10;
  26. res.quot++;
  27. }
  28. return res;
  29. }
  30. char * utoa_fast_div(uint32_t value, char *buffer) {
  31. buffer += 11;
  32. *--buffer = 0;
  33. do {
  34. divmod10_t res = divmodu10(value);
  35. *--buffer = res.rem + '0';
  36. value = res.quot;
  37. } while (value != 0);
  38. return buffer;
  39. }