Assembly MIPS汇编中无除法或模运算余数的求法
我想找到一种不使用除法就知道整数是被3还是7除的方法,因为它在MIPS汇编中非常慢Assembly MIPS汇编中无除法或模运算余数的求法,assembly,mips,modulo,modulus,Assembly,Mips,Modulo,Modulus,我想找到一种不使用除法就知道整数是被3还是7除的方法,因为它在MIPS汇编中非常慢 我做了很多研究,但什么也没发现。你可以对每个位的余数求和。2^n mod 3类似于1,2,1,2,…,2^n mod 7类似于1,2,4,1,2,4,… 使用查找表使其速度更快。有一种方法,如所述,该方法需要(奇数)除数模的模/乘逆2**b。(本文的某些部分已经改进) 除数:(d)=3,7(奇数)是一个简单的例子。假设采用32位(无符号)算术,则逆模分别产生2863311531(0xAAAAAAAB)和30678
我做了很多研究,但什么也没发现。你可以对每个位的余数求和。
2^n mod 3
类似于1,2,1,2,…
,2^n mod 7
类似于1,2,4,1,2,4,…
使用查找表使其速度更快。有一种方法,如所述,该方法需要(奇数)除数模的模/乘逆
2**b
。(本文的某些部分已经改进)
除数:(d)=3,7
(奇数)是一个简单的例子。假设采用32位(无符号)算术,则逆模分别产生2863311531(0xAAAAAAAB)和3067833783(0xB6DB6DB7)。有一个在线计算器
我们还需要qmax=(2**32-1)/d
值:0x555555
和0x24924924
resp
要测试32位(无符号)数字(n)
,请执行单字乘法-即丢弃完整64位结果的高位字:q=dinv*n
如果(n)
可被(d)
整除,则(q)
必须满足:q*d==n
和q
int is_divisible_by_3 (uint32_t n)
{
uint32_t q = n * 0xAAAAAAAB;
return (q <= 0x55555555 && (q * 3 == n))
}