0

我有两个变量(实际上是两个不同矩阵的元素)。例如我想乘

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

使用位操作,我该怎么做。

我看到了对乘法常量的引用,而不是 3*2、3*4、3*8 等变量。但是我如何将相同的技术应用于乘法变量?如果有关于这个的帖子,你能指出我吗?谢谢!

4

3 回答 3

6

给定两个积分变量

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 上,您无法对两个变量的乘法进行微优化。

于 2013-04-19T14:17:23.407 回答