Divisionen sind teuer. Aber das wirst Du auch schon festgestellt haben.
In Assembler ließe sich sowas noch mehr optimieren, aber hast du mal
etwas im Stil von dem da probiert:
1 | void itoa (unsigned int input, char* digits)
|
2 | //digits muss ein Array sein das hinreichend groß ist.
|
3 | {
|
4 | unsigned char ucplace=0;
|
5 | unsigned int uidiv;
|
6 |
|
7 | while (ucplace<MAXDIGITS)
|
8 | {
|
9 | switch (ucplace)
|
10 | {
|
11 | case 0:
|
12 | {
|
13 | uidiv=10000;
|
14 | break;
|
15 | }
|
16 | case 1:
|
17 | {
|
18 | uidiv=1000;
|
19 | break;
|
20 | }
|
21 | ...//Die restlichen Zuweisungen, bis runter zu case 4: uidiv=1;
|
22 | }
|
23 |
|
24 | while (input >= uidiv)
|
25 | {
|
26 | input -= uidiv;
|
27 | digits[ucplace]++;
|
28 | }
|
29 | }
|
30 | return;
|
31 | }
|
Hab ich jetzt nur mal runtergeschrieben und nicht ausprobiert, aber die
Idee ist, so lang die höchste 10er Potenz abzuziehen (und die Anzahl zu
zählen) bis der Rest kleiner ist, dann die nächstniedrigere 10er Potenz
zählen usw.
Sollt klappen, schneller sein und weniger Platz fressen. In ASM könnte
man hier noch einiges mehr optimieren... ich guck mal ob ich Zeit finde,
brauchen kann man sowas bekanntlich immer mal.