● 実行速度について - 乗除算を避ける・変更する
バイト単位のシフト
除数が 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;