AVR sehr lange Integer Variablen

Gast #1284623
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
Persönliche Seite
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.