乗数が 2n 以外の場合は、加算とビットシフトを組み合わせれば対応できます。
例えば 3 倍の場合、3x = x + 2x とできるので、次のような演算処理にする事ができます。
FIXEDVAL temp[SIZE];
memcpy(temp,x ,SIZE);
fixed_lshift1bit(temp,SIZE); /* 2x */
fixed_add(x ,temp,SIZE); /* x + 2x */
5 倍する場合は x + 4x を計算すれば良い事になります(5 = 1 + 22)。
/* 5 倍専用.結果領域は fixed_mul32等と同じく倍の数値幅 */
void quintuple(PFIXEDVAL pval,PFIXEDVAL pres)
{
FIXEDVAL temp[SIZE * 2];
memcpy(pres,pval,SIZE); memset(pres + SIZE,0,SIZE);
memcpy(temp,pres,SIZE * 2);
fixed_lshift(pres,2,SIZE * 2); /* res = val * 4 */
fixed_add(pres,temp,SIZE * 2); /* res += val */
}
これらの方法は小さな乗数の場合に限ります。大きな乗数では、項数が少ない形でも fixed_mul の方が速い場合があります。