Hallo *, ich habe 120 Bit (15 Byte) Integer Variablen mit denen ich mit selbstgebauten Assembler Routinen herumrechne. Die Werte selbst stehen in 15 Byte Arrays: unsigned char ul_number[15]; mit dem niederwertigsten Byte an Position 0. Nun moechte ich das ganze als Zahl im Zehnersystem auf der Uart ausgeben. Gibt es da einen geschickteren Ansatz als Stelle fuer Stelle durch subtrahieren von 10^x die auszugebenden Zahlen zu berechnen?
>Nun moechte ich das ganze als Zahl im Zehnersystem auf der Uart ausgeben. Darf man fragen warum/wozu? (insbesondere: warum dezimal und nicht hexadezimal, das wäre nämlich sehr viel einfacher ?) > Gibt es da einen geschickteren Ansatz als Stelle fuer Stelle durch > subtrahieren von 10^x die auszugebenden Zahlen zu berechnen? Da der AVR nicht dividieren kann, Nein. hth, Jörg
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
Danke erst einmal. Ich habe es auf die schnelle durch ein Feld von unsigned longs realisiert, bei denen der Uebertrag in die naechste Stelle bei 10^7 stattfindet. Das sind gerade etwas mehr als 23 Bit, so dass noch etwas mehr als 8 Bit fuer den Uebertrag bleiben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.