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