通过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位 取决于你的硬件…… 但你可以试试: – >假设无符号长是32位 然后 :- 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;
} 
 然后反过来换右转 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
相关内容
