Учитывая (беззнаковое) целое число, каков самый быстрый способ преобразовать его в строку, содержащую его десятичное представление?
Самый простой способ сделать это — многократно делить на 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';
}
sprintf
, которая несет большие накладные расходы, потому что сначала нужно интерпретировать строку формата. Забавно, что я нашел более 4 функций для достижения противоположного эффекта (от строки к целому). Кажется, людям не часто нужно записывать десятичные числа. - person fuz   schedule 08.05.2012