3

私は部分的な乗算のように見えるものへの洞察を望んでいます。

#define LOW(x)  ((x)&0xffffffff)
#define HIGH(x) ((x)>>32)
unsigned long long NotMultiply(unsigned long long x, unsigned long long y)
{
    return  HIGH(x)*HIGH(y) + LOW(x)*LOW(y);
}

この関数は、次のように複数回繰り返されます。

unsigned long long DoBusyWork( unsigned long long x, unsigned long long y, int n)
{
     while (n--) 
          x = NotMultiply(x,y); 
     return x;
}  

この結果を計算するためのショートカットはありますか?
x == yの場合はどうですか?

詳細情報へのリンクがあれば役立ちます。

4

4 に答える 4

1

DoBusyWork(@RBerteigが示唆しているように、名前は危険信号です)は、コンパイラーにビジーループを最適化しないように強制する方法である可能性があります。

これらのとんでもないコンパイラは非常に賢くなっているので、「ああ!そこにループは必要ありません!あなたが計算しようとしているものがわかります!」と判断することがあります。プログラマーとしてのあなたの本当の興味にもかかわらず。

于 2009-04-29T01:01:29.997 に答える
1

奇妙なハッシュ計算のように見えます。2つの数値の下位32ビットを取得して乗算し、上位32ビットを取得して(下位の場所に移動して)乗算し、その合計を返します。

簡単にできるとは思いませんが、おそらくもっと速くなります。同じ値が再び返される場合は、whileループを中断できます。

unsigned long long DoBusyWork( unsigned long long x, unsigned long long y, int n)
{
     long long previousX = x;
     while (n--) 
     {
          x = NotMultiply(x,y); 
          if (x == previousX) break;
          previousX = x;
     }
     return x;
}

ループを早く終了する可能性が高いかどうかはわかりません。

于 2009-04-28T19:59:03.873 に答える
0

LOWは、下位32ビットのみを取得しようとしています。Highは、次の32ビットを32ビット下に移動します。NotMultiplyルーチン全体が、xとyの下位32ビットを一緒に乗算し、それらを上位32ビットに追加しようとしています。DoBusyWorkはそれをn回行います。

x == yの場合、HIGH(x)²+ LOW(x)²になります。

しかし、なぜ彼らがそれをしたいのか私にはわかりません。これは、xとyの上半分と下半分を一緒にマッシュアップするようなものです。

于 2009-04-28T19:52:59.177 に答える