【发布时间】:2012-05-16 08:06:35
【问题描述】:
给定一个(无符号)整数,将其转换为包含其十进制表示的字符串的一般最快方法是什么?
这样做的简单方法是反复除以 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';
}
【问题讨论】:
-
“给定一个(无符号)整数,通常最快的将其转换为整数的方法是什么?”你的意思是如果你从一个字符串开始?因为将整数转换为整数的最快方法是什么都不做:)
-
@FUZxxl 对不起,我总是不小心进入C标签。
-
@Seth 没问题。我只是有点不喜欢“只使用 X,我不在乎也不知道它对谁有用”
-
@FUZxxl 这取决于您所说的“快速”是什么意思。如果你真的想完成某件事,使用内置函数是最快的。所以我想我会这样回答(虽然这不是我当时不知道的 C++)。没有伤害的意思。
标签: c performance data-conversion