基于32位寄存器的128bit/64bit非恢复除法算法初始化问题
关于128bit÷64bit非恢复除法的初始化问题解答
嘿,刚好对非恢复除法的实现细节有点熟,来给你掰扯清楚这俩初始化问题!
问题1:计数次数是否需要设置为128?
不需要,应该设置为64次。
原因很简单:非恢复除法的迭代次数等于除数的位宽(这里是64位)。我们的目标是生成64位的商和64位的余数(128bit被除数 ÷ 64bit除数时,余数必须小于除数,因此余数是64位;常规实现中默认被除数小于除数×2^64,此时商刚好是64位)。
具体来说,我们会把128bit被除数拆成高64位(初始存入寄存器A)和低64位(初始存入寄存器Q),每一次迭代都会生成商的一位,64次迭代后,Q里就存好了完整的64位商,A里则是最终的余数。如果硬要设成128次,不仅会做很多无效操作,还会导致商和余数的结果出错。
问题2:寄存器A需要多少位,是否为128位?
不需要,A只需要64位就足够了。
非恢复除法里,A是用来存储中间余数的寄存器,它的位数只需要和除数的位宽保持一致(这里是64位)。初始化时A存入被除数的高64位,之后每次迭代会左移A和Q(把Q的最高位移入A的最低位),然后对A进行减法/加法操作——非恢复除法的特性会保证A的绝对值始终小于除数,所以64位的寄存器完全能装下所有中间结果和最终余数。用128位的A纯粹是浪费寄存器资源,也不符合非恢复除法的常规设计逻辑。
内容的提问来源于stack exchange,提问作者Xeos
相关产品推荐
相关产品推荐

