Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS汇编中无除法或模运算余数的求法_Assembly_Mips_Modulo_Modulus - Fatal编程技术网

Assembly 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

我想找到一种不使用除法就知道整数是被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)和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))    
}