我有两个变量(实际上是两个不同矩阵的元素)。例如我想乘
a[i][k]*b[k][j]
使用位操作,我该怎么做。
我看到了对乘法常量的引用,而不是 3*2、3*4、3*8 等变量。但是我如何将相同的技术应用于乘法变量?如果有关于这个的帖子,你能指出我吗?谢谢!
我有两个变量(实际上是两个不同矩阵的元素)。例如我想乘
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 上,您无法对两个变量的乘法进行微优化。