我有两个变量(实际上是两个不同矩阵的元素)。例如,我想要乘以
a[i][k]*b[k][j]
使用位操作,我该怎么做。
我看到了对乘法常数的引用,而不是像3 * 2,3 * 4,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上,您无法微观优化两个变量的乘法。