我想找到一种方法来知道一个整数是除以3还是7而不使用除法,因为它在MIPS汇编中非常慢。
我做了很多研究但一无所获。
有一种方法描述为格兰隆德和蒙哥马利 https://gmplib.org/~tege/divcnst-pldi94.pdf需要(奇)除数模的模/乘法逆2**b
。 (本文的某些部分已得到改进recently https://gmplib.org/~tege/division-paper.pdf)
除数:(d) = 3, 7
(奇数)是一个简单的情况。假设 32 位(无符号)算术,模数的逆2**32
yield 2863311531 (0xAAAAAAAB)
and 3067833783 (0xB6DB6DB7)
分别。有一个在线计算器here http://www.hackersdelight.org/magic.htm.
我们还需要qmax = (2**32 - 1) / d
价值观:0x55555555
and 0x24924924
resp.
测试 32 位(无符号)数字(n)
,执行单字乘法 - 即丢弃完整 64 位结果的高位字:q = dinv * n
If (n)
可以整除(d)
, then (q)
必须满足:q * d == n
and q <= qmax
. e.g.,
int is_divisible_by_3 (uint32_t n)
{
uint32_t q = n * 0xAAAAAAAB;
return (q <= 0x55555555 && (q * 3 == n))
}
它用几个单字乘法代替了除法/余数。
同样对于d = 7
。或者,像 gcc 这样的现代编译器将对常数除数/模执行类似的优化,例如,if (n % 3 == 0) ...
- 在为 MIPS 等生成的程序集中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)