So ungeschickt ist das nicht.
Es ginge auch ne Art BCD-Arithmetik. Angenommen, du willst x=0b1101
augeben. Dein Feld mit den Ziffern initialisiert du zu z=000...0 und
gehst dann die Binärziffern von ober her durch nach folgendem Schema:
1 | n := bitcount (z)
|
2 | while n > 0
|
3 | n := n-1
|
4 | z := z+z (1)
|
5 | if (bit_n(z) == 1)
|
6 | z := z+1 (2)
|
7 | end while
|
(1) z+z berechnest du ziffernweise, also
1 | i := 0;
|
2 | BASIS := 10
|
3 | carry := 0
|
4 |
|
5 | for (i)
|
6 | z[i] := 2 * z[i] + carry
|
7 | if (z[i] >= BASIS)
|
8 | z[i] := z[i] - BASIS;
|
9 | carry := 1
|
10 | else
|
11 | carry := 0
|
12 | i := i+1
|
13 | end for
|
(2) ist einfach. Es gibt keine Übertrag, weil z[0] an der Stelle immer
gerade ist: z+1 ergibt sich einfach durch z[0] := z[0]+1.
Ausgegeben wird dann der String ..., z[2]+'0', z[1]+'0', z[0]+'0'
Die Arithmetik ist zwar simpel, aber einfacher als dein Ansatz ist
dieser auch nicht wirklich. Nur das eben zur Ausgabe die große Zahl nur
bitweise getestet werden muss; Arithmetik darauf wird nich benötigt.
Dafür braucht's die Zeichen- bzw. BCD-Arithmetik -- die zugegeben keine
hohe Kunst ist.
Johann