Szám növelése, csökkentése


Növelés

Ez a függvény az argumentumaként kapott q számot növeli meg a szintén argumentumként kapott egy digites cy értékkel.

A visszatérési érték 1 ha minden rendben, és a növelés megtörtént. 0 ha az eredmény nem fér el azon a helyen, ami q számára rendelkezésre áll.

q eredeti értékét a növelt értékkel felülírja a függvény, abban az esetben is, ha az eredmény nem fér el q-ban. Ebben az esetben q lefutás utáni értéke nem definiált.

int Increment(Number q, int cy){
 register int i,acc;
cy értéke a ciklus mindenegyes megkezdésekor annyi, amennyivel a 256 i helyiértéken levő digitet növelni kell. Ezt az értéket a program hozzáadja a digithez, és egy átmeneti helyen tárolja. Ennek az értéknek a 256-od részét kell majd a következő digithez hozzáadni, míg az aktuális digit új értéke az lesz, ami acc átmeneti tároló alsó bájtjában van. A ciklust addig kell folytatni, amíg van a felsőbb helyiértékű digitekhez hozzáadni való és amíg vannak még digitek.
 for( i = 0 ; i n && cy ; i++ ){
 acc = q->digit[i] + cy;
 cy = acc / 0x100;
 q->digit[i] = acc & 0xff;
 }
Ha a ciklus úgy ért véget, hogy még lett volna hozzáadni való a nagyobb helyiértékű digitekhez, de már nincsnenek ilyen digitek, akkor az eredmény nem fér el a q számára rendelkezére álló helyen. Ha nem, akkor a növelés sikeres volt.
 if( cy )return 0; else return 1;
 }

Csökkentés

Csökkenti az argumentumaként kapott számot a szintén argumentumaként kapott bájtos értékkel. A visszatérési érték 1, ha a csökkentés megtörtént, és 0 ha a kapott eredmény negatív lenne.
int Decrement(Number a, int Value){
 register int j;
Ha a legalsó digitje kissebb, mint a levonandó érték, akkor a többi digittel nem is kell törődni. Ez a leggyakoribb eset a használat során, ezért ennek a külön vizsgálata gyorsítja a programot.
 if( a->digit[0] >= Value ){
 a->digit[0] -= Value;
 return 1;
 }
 else{
Ha nem ez a helyzet, akkor kölcsön kell vennünk egy bitet az eggyel nagyobb helyiértékű digitből.
 a->digit[0] += 0x100 - Value;
A kölcsönvett bitet vissza kell adnunk, azaz levonni eggyet a második, harmadik, ... digitből, mindaddíg, amíg találunk egy olyan ditiet, ami pozitív, vagy amíg el nem fogynak a digitek.
 for( j=1 ; j n ; j++ ){
Ha le lehet vonni a kölcsönvett bitet az aktuális digitből, akkor megtesszük, és készen vagyunk, sikeres volt a csökkentés.
 if( a->digit[j] ){
 a->digit[j] --;
 return 1;
 }
Ha nem sikerült, akkor a digit értéke 255 lesz, és az eggyel nagyobb helyiértékű digitből kell levonni egyet.
 a->digit[j] = 0xff;/* 0+0x100-1 is constant. */
 }
 return 0;
 }
 }

toc