您好,我正在为嵌入式系统实现一些定点数学内容,并且我正在尝试执行两个 16.16 定点数的乘法而不创建 64 位临时数字。到目前为止,这是我想出的生成最少指令的代码。
int multiply(int x, int y){
int result;
long long temp = x;
temp *= y;
temp >>= 16;
result = temp;
return result;
}
这段代码的问题是它使用了一个临时的 64 位整数,这似乎会生成错误的汇编代码。我正在尝试创建一个使用两个 32 位整数而不是 64 位整数的系统。有人知道怎么做吗?
将您的数字想象为每个数字都由两个大“数字”组成。
A.B
x C.D
数字的“基数”是 2^bit_width,即 2^16 或 65536。
所以,产品是
D*B + D*A*65536 + C*B*65536 + C*A*65536*65536
然而,要将乘积右移 16,您需要将所有这些项除以 65536,因此
D*B/65536 + D*A + C*B + C*A*65536
In C:
uint16_t a = x >> 16;
uint16_t b = x & 0xffff;
uint16_t c = y >> 16;
uint16_t d = y & 0xffff;
return ((d * b) >> 16) + (d * a) + (c * b) + ((c * a) << 16);
签名版本有点复杂;对绝对值进行算术通常是最简单的x
and y
然后修复标志(除非你溢出,你可以相当乏味地检查)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)