【发布时间】:2014-09-08 04:33:20
【问题描述】:
我正在编写一个使用移位和加法的软乘法函数调用。现有的函数调用如下:
unsigned long __mulsi3 (unsigned long a, unsigned long b) {
unsigned long answer = 0;
while(b)
{
if(b & 1) {
answer += a;
};
a <<= 1;
b >>= 1;
}
return answer;
}
虽然我的硬件没有乘法器,但我有一个硬移位器。移位器一次最多可移位 16 位。
如果我想充分利用我的 16 位移位器。关于如何调整上面的代码以反映我的硬件功能的任何建议?给定的代码每次迭代仅移动 1 位。
16 位移位器一次最多可将 32 位无符号长整数值移位 16 位。 sizeof(unsigned long) == 32 位
【问题讨论】:
-
那么,在你的机器上,
sizeof(unsigned long) == 4 && CHAR_BIT == 8?值得说明的是,因为我主要在 64 位上工作,所以默认情况下sizeof(unsigned long) == 8对我来说,可能还有很多其他人。您的 16 位移位器只能移位 16 位(unsigned short,还是unsigned int?)数量,而不是 32 位数量?或者它可以一次将 32 位unsigned long值最多移动 16 个位置?还是别的什么? -
感谢您帮助我更好地改进我的问题。在您指出之前,我从未想过这个问题。
-
直到您指出这一点,我才意识到我并不准确。后者是正确的:16 位移位器一次最多可以将 32 位无符号长整型值移位 16 位。 sizeof(unsigned long) == 32 位
标签: c assembly bit-manipulation multiplication bit-shift