2 つの変数があります (実際には 2 つの異なる行列の要素です)。たとえば、乗算したい
a[i][k]*b[k][j]
ビット操作を使用して、どうすればそれを行うことができますか。
3*2、3*4、3*8 などの変数ではなく、定数の乗算への参照を見ました。しかし、同じ手法を変数の乗算にどのように適用できますか? これに関する投稿があれば、それを教えてもらえますか。ありがとう!
2 つの変数があります (実際には 2 つの異なる行列の要素です)。たとえば、乗算したい
a[i][k]*b[k][j]
ビット操作を使用して、どうすればそれを行うことができますか。
3*2、3*4、3*8 などの変数ではなく、定数の乗算への参照を見ました。しかし、同じ手法を変数の乗算にどのように適用できますか? これに関する投稿があれば、それを教えてもらえますか。ありがとう!
与えられた 2 つの整数変数
unsigned X, Y;
また、Commodore 64、Apple ][、または独自の乗算命令を持たない他のアーキテクチャが与えられた場合、これは数値を乗算します。
unsigned answer = 0;
while ( X )
{
answer <<= 1;
if ( X & 1 )
answer += Y;
X >>= 1;
}
ビット シフト乗算は、2 の累乗 (2、4、8、16 など) で乗算する場合にのみ使用できます。乗算は、単一のビット シフト演算に縮小されます。
x1 = 2^n;
result = x2 << n; // This is the same as x2 * x1
任意のケースでは、最も効率的な方法は通常の乗算を使用することです。
a[i][k]*b[k][j]
巨大な行列を乗算する場合、重要なのは、キャッシュ動作が良好な効率的なアルゴリズムです。C++ の場合は、Eigen ライブラリを確認してください。最新の CPU では、2 つの変数の乗算をマイクロ最適化することはできません。