1

32 x 32 ビットの符号なし乗算を 24 ビット dsp に移植したい (これは線形合同ジェネレーターであるため、切り捨てることはできません。また、現在の LCG を 24 ビットのものに置き換えたくありません。 )。利用可能なデータ型は 24 ビットと 48 ビットの整数です。

最後の 32 LSB だけが必要です。通常の方法よりも少ない乗算、マスク、シフトでこれを実装するためのハックを知っていますか?

行は次のようになります。

//val is an int(32 bit)
val = (1664525 * val) + 1013904223;
4

2 に答える 2

0

アウトラインは次のようになります (現在のコンパイラ スタイルで):

static uint48_t val = SEED;
...
val = 0xFFFFFFFFUL & ((1664525UL * val) + 1013904223UL);

うまくいけば、コンパイラは次のことを認識します。

  • 乗算および累算コマンドを使用できます
  • 定数の「上位ワード」がゼロであるため、削減された乗算アルゴリズムのみが必要です。
  • AND は、上位ビットをリセットするか、定数を掛けて元に戻すことで実行できます。
  • ...その他のものは {mystery dsp} ターゲットに依存します

係数を 2^16 倍に拡大すると、切り捨てを無料で行うことができます が、情報が不足しているため、全体的により良いかどうかを調査/決定する必要があります。

于 2014-08-09T07:11:34.630 に答える