使用位移操作将两个变量相乘

时间:2013-04-19 13:59:18

标签: c++ c unix bit-manipulation

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

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

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

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

3 个答案:

答案 0 :(得分:6)

给出两个积分变量

unsigned X, Y;

鉴于Commodore 64,Apple] [或其他一些没有自己的乘法指令的架构,这将会增加数字。

unsigned answer = 0;
while ( X )
{
  answer <<= 1;
  if ( X & 1 )
    answer += Y;
  X >>= 1;
}

答案 1 :(得分: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]

答案 2 :(得分:1)

如果你将巨大的矩阵相乘,重要的是一个具有良好缓存行为的高效算法。对于C ++,请查看the Eigen library。在现代CPU上,您无法微观优化两个变量的乘法。