● 実行速度について - 乗除算を避ける・変更する

バイト単位のシフト

除数が 28n の場合(n > 0)、開始位置を移動する事でも除算を行えます。

例えば、n が 1 の場合(28 = 256)、
    pval++;    /* val / 256 */

         ポインタの型に注意
         PFIXEDVAL型か (unsigned) char * 型である事
pval が指す数値自体を右シフトするのではなく、開始位置を左に(上位側に)移動する事で、相対的に数値をシフトさせます。
fixed X のビットシフトは変数全体に対して行われますので、例え 1 bit だけのシフトであっても、変数の数値幅分、内部処理を繰り返します(「数値幅を小さくする」参照の事)。一方、開始位置を移動する方法では、一回分の加算だけです。

開始位置を移動しただけでは全体の長さが足りなくなりますので、変数領域を最初から余分に取っておき、必要な時に上位側を初期化するようにします。
    FIXEDVAL        val[width + 1]; /* 数バイト余分に確保しておく */
    PFIXEDVAL       pval;

    pval = val;

                ・
                ・
                ・

    pval[width] = 0;     /* 右シフト後に空く上位側をゼロで埋める */
    pval++;              /* 8 bit 右シフト : pval / 256 */
増分は 4 バイト単位でなくても問題ありません(width が 4 バイト単位なら問題は無い)。



除数が 32bit単位の場合は数値幅を減らす事ができますので、変数領域を余分に取っておく必要は無くなります。
    pval += 4;    /* val / 4294967296 */
    width -= 4;   /* 全体の長さを調整する */
ただし、width > 4 である必要があります。また、数値幅が減るため、後続の計算でオーバーフローが発生するかもしれません。


乗算の場合は、上記の逆の操作を行います。
    FIXEDVAL        val[width + 1];
    PFIXEDVAL       pval;

    pval = val + 1;

                ・
                ・
                ・

    pval--;
    pval[0] = 0;