0

2 つの変数があります (実際には 2 つの異なる行列の要素です)。たとえば、乗算したい

a[i][k]*b[k][j]  

ビット操作を使用して、どうすればそれを行うことができますか。

3*2、3*4、3*8 などの変数ではなく、定数の乗算への参照を見ました。しかし、同じ手法を変数の乗算にどのように適用できますか? これに関する投稿があれば、それを教えてもらえますか。ありがとう!

4

3 に答える 3

6

与えられた 2 つの整数変数

unsigned X, Y;

また、Commodore 64、Apple ][、または独自の乗算命令を持たない他のアーキテクチャが与えられた場合、これは数値を乗算します。

unsigned answer = 0;
while ( X )
{
  answer <<= 1;
  if ( X & 1 )
    answer += Y;
  X >>= 1;
}
于 2013-04-19T14:14:56.217 に答える
2

ビット シフト乗算は、2 の累乗 (2、4、8、16 など) で乗算する場合にのみ使用できます。乗算は、単一のビット シフト演算に縮小されます。

  x1 = 2^n;
  result = x2 << n;  // This is the same as x2 * x1

任意のケースでは、最も効率的な方法は通常の乗算​​を使用することです。

a[i][k]*b[k][j]
于 2013-04-19T14:11:22.077 に答える
1

巨大な行列を乗算する場合、重要なのは、キャッシュ動作が良好な効率的なアルゴリズムです。C++ の場合は、Eigen ライブラリを確認してください。最新の CPU では、2 つの変数の乗算をマイクロ最適化することはできません。

于 2013-04-19T14:17:23.407 に答える