我正在编写一个使用移位和加法的软件乘法函数调用。现有的函数调用如下:
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个位置?还是其他什么? - Jonathan Leffler