前のエンドポイントが新しい開始点である一連の値を補間すると仮定します。
(B-A)/(x/255)+A
悪い考えのように聞こえます。不動点表現として基数255を使用する場合、同じ内挿を2回取得します。x = 255の場合はBを取得し、x=0の場合は新しいAとしてBを取得します。
固定小数点システムとして256を使用します。除算はシフトになりますが、16ビットの算術演算と8x8の乗算と16ビットの結果が必要です。前の問題は、上位バイトのビットを0になるように無視するだけで修正できます。x mod 256
この提案では、16ビットの乗算を使用しますが、オーバーフローすることはできません。同じxを2回補間することはありません。
interp = (a*(256 - x) + b*x) >> 8
256 - x
を取得すると、借用による減算になります0 - x
。
PICには、命令セットに次の操作がありません。
- 左右シフト。(論理と算術の両方)
- あらゆる形式の乗算。
代わりにrotate-rightを使用して右シフトし、続いて左側の余分なビットをビット単位でマスクすることができます-and。16ビットの結果で8x8の乗算を行う簡単な方法:
void mul16(
unsigned char* hi, /* in: operand1, out: the most significant byte */
unsigned char* lo /* in: operand2, out: the least significant byte */
)
{
unsigned char a,b;
/* loop over the smallest value */
a = (*hi <= *lo) ? *hi : *lo;
b = (*hi <= *lo) ? *lo : *hi;
*hi = *lo = 0;
while(a){
*lo+=b;
if(*lo < b) /* unsigned overflow. Use the carry flag instead.*/
*hi++;
--a;
}
}