给定一个(无符号)整数,将其转换为包含其十进制表示的字符串的通常最快的方法是什么?
最简单的做法是反复除以 10,直到达到零。我不喜欢这种方法,因为它
- 使用整数除法,这在某些集成平台上既慢又不可用
- 要求程序员事后翻转字符串。这使所需的内存操作数量增加了一倍。
我想到了以下将整数转换为十进制基数的方法。这是一个好主意吗?这是如何在函数的常见实现中完成的printf?
#include <stdint.h>
const static uint64_t i64_tab[20] = {
                     1u,
                    10u,
                   100u,
                  1000u,
                 10000u,
                100000u, /* 10^ 5 */
               1000000u,
              10000000u,
             100000000u,
            1000000000u,
           10000000000u, /* 10^10 */
          100000000000u,
         1000000000000u,
        10000000000000u,
       100000000000000u,
      1000000000000000u, /* 10^15 */
     10000000000000000u,
    100000000000000000u,
   1000000000000000000u,
  10000000000000000000u  /* 10^19 */
};
void uint64_to_string(char *out, uint64_t in) {
  int i;
  uint64_t tenpow;
  char accum;
  for (i = 19;i > 0;i--) {
    if (in >= i64_tab[i]) break;
  }
  do {
    tenpow = i64_tab[i];
    accum = '0';
    while (in >= tenpow) {
      in -= tenpow;
      accum++;
    }
    *out++ = accum;
  } while (i --> 0);
  *out = '\0';
}
const static uint32_t i32_tab[10] = {
           1u,
          10u,
         100u,
        1000u,
       10000u,
      100000u, /* 10^ 5 */
     1000000u,
    10000000u,
   100000000u,
  1000000000u, /* 10^9  */
};
void uint32_to_string(char *out, uint32_t in) {
  int i;
  uint32_t tenpow;
  char accum;
  for (i = 9;i > 0;i--)
    if (in >= i32_tab[i]) break;
  do {
    tenpow = i32_tab[i];
    accum = '0';
    while (in >= tenpow) {
      in -= tenpow;
      accum++;
    }
    *out++ = accum;
  } while (i --> 0);
  *out = '\0';
}