Átalakulni egy string
A feladat konvertáló egy számot húr mindig, ha azt szeretné, hogy megjelenjen a számszerű eredményeket a program. A processzorok mi működik bináris adat, az ember mint Adj tizedes. Valójában a probléma az, hogy átalakítani a bázis számát. Mi a teendő, van mód? E könyv célja, hogy leírja és hasonlítsa össze a maximális számú módon átalakítani egy számot egy string. A probléma természetesen figyelembe véve a végrehajtás szempontjából, annak a mikrokontroller, a méret és a sebesség fontos. Az egyszerűség kedvéért úgy csak nélkül aláírt 32 bites és 16 bites számok (nem sokkal nehezebb a jel).
1. sprintf
Az első dolog, ami eszembe jut egy függvény sprintf a szabványos C könyvtár. Használata egyszerű:
Majd a buffer van szükség a mi sorban.
De a baj az, hogy ez a sprintf formázott kimeneti függvény, ami egy csomó dolog lehet, és húz egy csomó más funkciók a standard könyvtár. A méret gépi kódot, ha azt használják jelentősen növekszik. Például még a minimális verziója sprintf avr-libc (ez az, amit egy része WinAVR / AVR Toolchain) hozzáad egy kicsit kevesebb, mint 2 kilobyte.
2. utoa, ultoa
A készítmény könyvtárak mellékelt összeállítói gyakran egy transzformációs függvény egy karakterlánc itoa, ltoa, utoa, ultoa. Általában ezek a funkciók nem szabványos, a lábak gyakran rendelkezésre állnak, és szemben a sprintf, nem csinál semmit extra.
3. Kivonat számok elosztjuk 10.
Ready szabványt és nem nagyon divatos megjelenés. Most itt az ideje, hogy újra feltalálni a kerékpárt. Az első legkézenfekvőbb módja természetesen osztva 10, és a fennmaradó összeget pedig a számítási ciklus.
A fennmaradó részlege ad nekünk a tizedes jegyek fordított sorrendben, kezdve a legfiatalabb, így írni a puffer végén induló, így nem az eredményül kapott karakterlánc.
Úgy tűnik, minden csak szép, semmi több, de van egy dolog. Valójában részlege, és még a egyensúly kiszámításakor. Ha a processzor nem a hardver részleg, nagyon lassú.
4. eltávolítása osztály számok 10 olyan függvény div
Lehet próbálja használni a beépített függvény div, ami azonnal visszaadja a hányados és a maradék?
De az osztály továbbra is fennáll. Az előnye ennek a korábbi módszerrel, az a tény, hogy képes átalakítani a számot egy string bármilyen okból (ha Yoh némileg módosítani), nem feltétlenül 10.
5. Osszuk 10 shift és kívül.
Ha a cél processzor nincs hardveres támogatás 32 bites részlege, az előző két módszer meglehetősen lassú. Osztály 10 helyettesíteni lehet egy sor műszakban és kiegészítések. Ihlette a könyv „algoritmikus trükkök programozók” (ez ugyanaz a «Hacker örömére»), vegye ki a szétválás funkció használatával a 10 váltások és kiegészítései, cseréje ott érvényben szorozva 10 (túl „drága” az AVR, legalább) eltolódik, és kívül. Módosítjuk úgy, hogy jön vissza, és a hányados és a maradék:
Úgy néz ki, szörnyű, és nem világos, de valójában egyszerű. Először is, megszorozzuk az eredeti szám a 0,8 vagy 0,1100 1100 1100 1100 1100 1100 1100 1100 bináris ábrázolás. Ez nagyon kényelmes, hogy a frakció időszakos és sikerült ezt mind az öt műszakban és négy kiegészítéseket. Következő osztani, hogy mi történt a 8, áttevődik a megfelelő 3 mentesítést. Kiderült, az eredeti szám osztva 10-ig az egység miatt kerekítési hibák. Miután megtalálják a maradékot szorzataként kapott hányados 10, és kivonva azt az eredeti számot. Ha a fennmaradó több mint 9, akkor állítsa be és magán.
A funkció a „gyors” osztály nem különbözik megjelenésében elődei.
6. Kivonás 10 fok.
Egy másik népszerű eljárás egy számot egy string, kivonjuk az eredeti sorszáma 10 fok, kezdve a maximumot. Szükséged lesz egy táblázat ezekkel fok 10:
40 bájt méretű. És a funkciót is:
Works egyszerű, mindaddig, amíg a jelenlegi szám nagyobb, mint 10 fok vonja ki azt a számot, 10 fok, és megvizsgálja, hogy mennyi idő levontuk. Akkor megy alacsonyabb fokú 10. Tehát, amíg nem kap 1. A számok közvetlenül kapjuk a kívánt sorrendben, csak akkor kell eltávolítani nullát.
Módszerek BCD szám.
Az alábbi három módszer alapulnak műveletek a csomagolt bináris kódolt decimális - binárisan kódolt decimális (BCD). Ezen a képen minden majszol (4 bit) tárolja decimális számjeggyel. A 32 bites változó így tárolni 8 decimális. A bináris ábrázolása egy 2 bites változó 10 tizedesjegy. Ezért ezeknek a módszereknek a találatok levágjuk a nagyobb számok 99999999. BCD szám nagyon könnyen átalakítható egy string:
Valójában a műveletek BCD, mi kell hozzá, és szorozzuk meg 2, ami sikeresen helyébe szám hozzáadásával önmagával. Ezért csak akkor van szükség hozzáadásával:
Úgy néz ki, szörnyű, és nem világos, hogy - ismét trükkös bitmap Mojo. Tény, hogy két BCD egyszerűen vegye fel őket, mint egy hagyományos bináris szám - vonal a + b =. És akkor minden falat, amelynek értéke több mint 9 kell hozzá a korrekciós szám 6 átadása bitek legjelentősebb falat. És minden majszol az volt az átadása bitek legjelentősebb majszol, meg kell is hozzá a korrekciós szám 6. Minden más vonalakon működni - éppen ez a korrekció. Az első két sor, mi határozza meg az összes bit összefoglalni a + b + 0x66666666ul. amely megváltoztatta az értékét, mert az áttételt az LSB bit. A harmadik sorban adjuk hozzá a két számot. A negyedik - válassza ki az alsó cserélhető bit minden négyes. Más - 6 hozzátesszük a tetradból amelynek vittük bit. Így - anélkül, hogy a feltételes átadás.
7. hozzáadása hatásköre kettő.
Az első módszer jól ismert minden az én iskolai számítástechnika órák, - kiegészítve a decimális ábrázolása hatásköre két megfelelő egyetlen bit az átalakított szám:
7. hozzáadása hatványaira az asztalra.
Az előző módszer két összegző BCD szám. Egyikük lehet küszöbölni azáltal, hogy egy ereje kettő az asztalon:
Táblázat elmentov tartalmaz 30-120 bájt.
8. Horner-módszerrel
Ebben az eljárásban, minden egyes lépésében megduplázva a felhalmozott decimális eredménye, ha a MSB a bináris számú, majd adjunk hozzá, hogy eredményeként egység, amelynél a bináris számot megszorozzuk 2 (eltolási per kicsit balra).
Itt a két BCD összeadást, de egyikük azzal a kiegészítéssel, 1 és ez lehet megszabadulni.
Ebben az esetben az első bcd_add érv nem érvényes BCD, ahol a fiatalabb rágcsál egy számjegy 9-nél nagyobb, de mi bcd_add általában megrágja, hogy a helyes eredményt. De ha hozzá ezt a plusz egység a második érv, az eredmény már nem helytálló.
Az ismétlések számát a ciklusban ez a módszer mindig egyenlő a bit szám, ellentétben a korábbiakkal, ahol a ciklus véget ér, amint lesznek azok az egyes bitek.
9. kivonat számokat megszorozzuk 10.
Most tulajdonképpen az a része, amelyre minden kezdődött - összehasonlítva a sebességet. Az első platform tesztelhető AVR GCC fordító.
Módszereknek a különböző idő különböző tényezőktől függ, mint például a módszereken alapuló osztály 10 alkalommal nagyban függ a tizedesjegyek száma az abszolút érték az a szám, és nagyon kevés ilyen számok önmagukban. Kivonás 10 fok a ciklus gyorsabb lesz működni, mint a kisebb összegű tizedesjegy teszik ki a számokat. Ez 1000000 kezelni sokkal gyorsabb, mint 999999. A módszer alapja az a bináris-decimális számok gyorsabban futnak, ha az eredeti szám a kis egyes bitek - a leggyorsabb a hatáskörét kettő. Ez utóbbi módszer a munkaidő függ csak az abszolút értéke az átalakított szám, de kevésbé, mint a módszerek osztás 10. Így a teszt kit kell a kis Chila, nagy számok, ereje 2-10 fok, ahol sok kilences.
Mindenféle teszteket AVR hajtjuk végre Simulavr szimulátor - nem kell sem a vas, és számos pereproshivok.
Mérni az átfutási idő a függvények használata 16 bites időzítő ketyeg a mag frekvencia. Konzol kimenetet hibakeresési port emulátor. kód optimalizálása a maximális sebességet.
Itt van, mi történt eredményeként 32 bites számok:

* Után a plusz méretfüggőség - egy táblázat vagy osztódó funkció
** zárójelben az eredmények a változatot a inline szerelvény.
A vezető ezen összehasonlítási alap nem nagy mozgásteret módszer gyorsan osztódó 10 műszak és kívül. Ahhoz, hogy közelebb kivonás fok 10. Miután szorzás módszerével 10. Az eljárások becsületes körzet (beleértve utoa), mint az várható volt, nagyon lassú, különösen olyan, amely ldiv funkciót. hanem a legtöbb kompakt. Az eljárás végrehajtását Horner gyakorlatilag független a konvertált számát. sprintf működik viszonylag gyorsan, míg utoa. És nem csoda - régen egy hasonló módszerrel utoa_fast_div, de overhead elemzés a format string és a lassú kimenetet egy puffer keresztül fputc teszik magukat érezni.
UPDATE.
Eredmények 16 bites számok:

Itt ismét egy figyelemre méltó előnye vezető gyors osztódása műszakban / hajtva. Legrosszabb eredmény most sprintf, mert belülről még mindig használ egy 32 bites szám.
UPDATE # 2. Eredmények MSP430.

Eredmények 16 bites számok:

Mert amellett, hogy MSP430 Launcpad-és kő MSP430G2231 más MSP430 még nem volt kipróbálni. Minden funkció természetesen nem fér el, a víz alá, és vizsgáltuk egyenként szkript használatával.
Mint látható, igazságos megosztása itt majdnem kétszer lassabb, mint a AVR.
UPDETE # 3
Eredmények STM32.

az eredmények megvitatása
Outsider mindenütt függvényében a könyvtárat használó osztály div funkciót. Annak ellenére, hogy visszatér egy hívást, és a maradékot és a hányados, még STM32 hardver részlege, hogy végre szoftverek és nagyon lassan fut. Nyilvánvaló, hogy ez a módszer nem alkalmazható. Azonban a függvény egy beépített kezelő részlege utoa_builtin_div. sodró végén az AVR és MSP430, a STM32 - az élen. Nem meglepő, hiszen a Cortex M3 hardveres részlege, sokan azt mondják, és nem egészen igaz - a szétválás valamit, de ez nem olyan gyors (zárójelben utoa_builtin_div meghatározott időben, ha a fordító, hogy létrehoz egy igazságos megosztása). Az a tény, hogy a GCC trükkös, ha elosztjuk a folyamatos használata egy ügyes trükk - helyettesíti osztás szorzás állandó, hogy a felső 32 bit, a 64 bites termék tartalmazza az eredeti osztalék osztva 10.
Ez a kód megfelel körülbelül a következő:
uint32_t TMP = érték;
Egy ilyen eljárás is le van írva a könyvben „algoritmikus trükkök programozók számára.” Azonban AVR és MSP430 ez a szám nem fog működni - van egy szorzás 32 * 32 => 64 művek illetlenül hosszú, hosszú igazságos megosztása.
Tovább utoa_builtin_div mindig van egy minimális méretet.
Mindig jó, és gyakran jobb eredményt ad az osztás 10 műszak és kívül utoa_fast_div. Ez szinte vitathatatlan vezetője sebesség és gyakran meglehetősen szerény méretű. Ez a módszer mindig jó választás.
Szeret sok fokkal kivonni tíz utoa_cycle_sub mérete az asztal közel azonos sutoa_fast_div. de mindig ad egy kis sebesség. Általában is, nem rossz választás.
A módszer alapja az a bináris decimális számok nem működnek nagyon gyorsan, nem kell a legkisebb méretű és ugyanaz a probléma csak a 8 számjegyű eredményt (az én végrehajtás, akkor mind a 10 számot, de még lassabb lesz). Ez jobb nem használni átalakítására bináris egész szöveggé és konvertáló bináris számokat decimális bináris csomagolt, vegye le a további munkához.
Eltekintve a módszer szorzás 10 utoa_fract. Nem néz ki nagyon vonzó az átlagos idő, azonban ez a legrosszabb időben gyakran kisebb, mint a legrosszabb időben vezetők. Ebben az eljárásban a különbség a legjobb és a legrosszabb viszonylag kicsi - ez stabil.
UPDATE.
Találtam egy másik érdekes és nagyon gyors módszer. Itt ide.
A leírás arról, hogyan működik a fenti link angolul. Sajnos, a helyes eredményt, ezzel a módszerrel csak 15 bites értékeket, de nagyon gyorsan:
AVR legjobb időt - 133 ciklusok, a legrosszabb - 167 átlag - 146.
Következik.
2. rész: Rögzített és lebegőpontos.
PS. Lehet, hogy valaki tudja, még mi bizonyos módszerek átalakítására számokat egy húr?
Fantázia több módszer alapján frakciók vagy sorok nem tudom, hogyan kell mondani. Ha kapsz - felvázolom az anyag (szükséges-e vagy sem - Beszéljen). De az előzetes eredmények tárolása nélkül a tört része rosszabb.
neiver. próbára, hogyan kell leírni, ha még mindig prisutsvuete az oldalon?
5 tesztelt módszer ismét a teljes körű uint32_t. Eltérést találtunk.
codepad.org/AZcD1P5Y
Hmm ... Kiderült, én először nem egészen értem az algoritmus: nem rágcsál (niibly, 4-bit) másolatot, és a páros minden alkalommal használt bitek száma a felhalmozást. Sly!
Hibát kitérő az automatikus korrekció eredményeként.
Hozzáadása egy másik műszak, a 32. és a 64-bites értékek is megfelelő értékeket. Úgy néz ki, mint egy kerekítési hiba van tolva a kapott összeg nem egészen világos számomra így, mert külön notebook (ebben az esetben egybeesik azzal az időszakkal, a frakció (1100) bin), a hiba halmozódik.
Nagyon köszönöm a cikket!
Hadd magyarázzam, hogy mit írtam, és úgy érzi, borúlátó. Ahhoz, hogy 52 (bomlik), és arra korlátozódik, hogy 8 bitet.
Mint kiderül, a műveletsornak fontos, hogy van, akkor nem nasdvigat, majd adja hozzá az eredmények változások, szükség van a felhalmozási minden műszakban. Olyan, mint az egyenértékű kell k.m.k.