加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

通过16位移位进行32位乘法运算

发布时间:2020-12-16 07:09:41 所属栏目:百科 来源:网络整理
导读:我正在使用移位和加法编写一个软乘法函数调用.现有的函数调用如下: 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;} 虽然我的硬件没有倍增
我正在使用移位和加法编写一个软乘法函数调用.现有的函数调用如下:

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(无符号长整数)== 32位

解决方法

基本方法是(假设换1): –

>移动前16位
>将前16位的最低位设置为最后16位的最高位
>移动最后16位

取决于你的硬件……

但你可以试试: –

>假设无符号长是32位
>假设Big Endian

然后 :-

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;
}

然后反过来换右转

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读