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

Multiplying two variables using bit shift operation

本文关键字:两个 变量 位操作      更新时间:2023-10-16

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

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

使用位操作,我该怎么做呢?

我看到引用乘法常数,而不是像3*2,3*4,3*8这样的变量。但是我如何把同样的技巧应用到变量相乘上呢?如果有这样的帖子,你能给我指出来吗?谢谢!

给定两个积分变量

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