Existiert ein algorithmus um möglichst effizient einen unsigned int (32 bit) in seine 10er stellen aufzuschlüsseln? Also mit weniger als 18 mul/div/mod operationen.
(Mein softcore hat kein HW mul, daher sind diese operationen sehr zeitintensiv).
Worum geht es hier eigentlich genau? Ich meine, ich habe 10 Zehen, die funktionieren auch noch ganz gut obwohl das früher wohl noch viel besser ging.
https://dl.acm.org/doi/pdf/10.1145/258726.258836
32 Bit haben üblicherweise 8 Hexstellen, und da kann man die einzelnen Fs oder was immer, einfach logisch bearbeiten.
Umwandlung von 32 bit unsigned int zu ASCII. (Das grundlegende Problem ist die Umwandlung 2er Kompl. zu 10er komplement).
Dies möglichst ohne division oder mudulo. Selbst Multiplikationen sind zeitintensiv - da all diese operationen von der CPU nicht nativ unterstüzt.
Aber weil der TO keine Hex-Zahlen will, sondern Dezimalzahlen, ist der größte mit 32 Bit darstellbare Wert eben 4294967296 und das sind 10 Dezimalstellen.
Existiert ein algorithmus um möglichst effizient einen unsigned int (32
bit) in seine 10er stellen aufzuschlüsseln? Also mit weniger als 18
mul/div/mod operationen.
Warum sollte man sowas verrückte tun?
Das menschliche Auge ist mit seiner Ablesegeschwindigkeit selbst einem kleinen PIC12 hoffnungslos unterlegen.
Wenn du da ein FPGA hast und einen Softcore, dann kannst du das doch
einfach gleich in Hardware machen und als "Funktionsbaustein" verwenden:
Ja wäre eine Möglichkeit, oder einfach nur die performantere Ausführung des Softcores auswählen. Also giebt etliche Workaround Möglichkeiten.
Aber da dieses vermutlich Jahrzehnte alte Problem schon längst in C gelöst zu schein scheint: "double dabble" - benötige ich eig nur kurz eine C implementierung dieser Funktion und das Thema kann geschlossen werden.
Weil ich das in der ISR mache und diese kurz halten möchte.
Das habe ich noch nie benötigt.
Typisch macht man Ausgaben nur 2..5 mal je Sekunde, um eine ergonomische Darstellung zu bewirken. Öfter läßt die Anzeige unangenehm flackern und behindert die Ablesbarkeit. Sich ständig ändernde Werte können dann unlesbar werden ("88888888").
Aber da dieses vermutlich Jahrzehnte alte Problem schon längst in C
gelöst zu schein scheint
Der erfahrene C-Progger nimmt dafür itoa, sprintf usw.. Sich selber was basteln macht man nur als Programmieranfänger.
Hier mal was aus meinen Anfängen:
Der erfahrene C-Progger nimmt dafür itoa, sprintf usw.. Sich selber was
basteln macht man nur als Programmieranfänger.
Ach so! Int2Ascii ohne mul/div/mod zum Anfang ist ein guter Einstieg. Auch wesentlich einfacher zu programieren als sprintf oder itoa zu nutzen. Um sprintf oder itoa zu nutzen muss man natürlich schon ein erfahrener C-Progger sein.
Und wer itoa oder sprintf nutzt ohne die eigenschaften der CPU zu kennen - macht auch gar nix falsch...
Um sprintf oder itoa zu nutzen muss man natürlich schon ein
erfahrener C-Progger sein.
Ja, es braucht schon etwas Zeit, um sprintf lieben zu lernen. Aber die mächtigen Formatierungsoptionen entschädigen einen dafür. Ich möchte es nicht mehr missen. Dann muß man nicht für jede Sonderlocke hunderte Spezialfunktionen definieren.