Jon*_*n J 5 c assembly bit-manipulation bit-shift multiplication
我正在使用移位和加法编写软乘法函数调用。现有的函数调用如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
尽管我的硬件没有乘法器,但我有一个硬移位器。该移位器一次最多可以移位16位。
如果我想充分利用我的16位移位器。关于如何修改上面的代码以反映我的硬件功能的任何建议?给定的代码每次迭代仅移位1位。
16位移位器一次最多可以将32位无符号长值移位16位。sizeof(unsigned long)== 32位
基本方法是(假设移位 1):-
有点取决于你的硬件...
但你可以尝试:-
然后 :-
union Data32
{
unsigned long l;
unsigned short s[2];
};
unsigned long shiftleft32(unsigned long valueToShift, unsigned short bitsToShift)
{
union Data32 u;
u.l = valueToShift
u.s[0] <<= bitsToShift;
u.s[0] |= (u.s[1] >> (16 - bitsToShift);
u.s[1] <<= bitsToShift
return u.l;
}
Run Code Online (Sandbox Code Playgroud)
然后以相反的方式向右移动
| 归档时间: |
|
| 查看次数: |
1665 次 |
| 最近记录: |