REM(A/B)=A/B的余数
INT(A/B)=A/B的商
求证:
X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
(此情况为溢出时)
X/N因为会溢出,所以可以把X分成高位和低位
即H和L
则X/N=(H*65536+L)/N
=(H/N)*65536+(L/N)
因为在debug里是看不到分数的
所以只有商和余数
而(H/N)*65536中,如果(H/N)得到的是分数
那么就会有余数,那么(H/N)怎么办?只能拿他的商来进行*65536?
那就会损失余数*65536的误差
所以只好把H拆分
我们知道H/N=A……B
那么H=AN+B
于是原式=[(AN+B)/N]*65536+(L/N)
=(A+B/N)*65536+(L/N)
=65536A+65536*B/N+L/N
=65536A+(65536B+L)/N
这时有人会疑问(65536B+L)/N如果得到的是分数那又怎么办?
(65536B+L)/N=C……D
65536B+L=CN+D
原式=65536A+(CN+D)/N
=65536A+C+D/N
我们知道余数比除数小
所以D<N
那么D/N的商为0,余数为D
而我们的要求是求X/N的商,如果有余数
那么这个余数会小于N,
而上面已知D<N
所以X/N和65536A+C+D/N的误差是一样的(即D/N的余数就是X/N余数)
因为只取商
所以原式=65536A+C+0
=65536A+C
=65536A+(65536B+L)/N的商
所以X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
也可以写成X/N=INT(H/N)*65536+INT{[REM(H/N)*65536+L]/N}
本人仅为初中水平,可能错漏百出,我也是无聊才写这东西,欢迎大家喷!
------解决方案--------------------------------------------------------
顶·~~
------解决方案--------------------------------------------------------
up!!
------解决方案--------------------------------------------------------
其实就是上小学那种渐除法,(其实你这种也是,只是用这样表述看似很理论化.在汇编语言中的大数除法[含除数和被除数都是大数]基本都采用渐除,当然,大数除比这还要多些讲究...就略过不说了).
以10进制来理解:
假设给定被除数为2位数,除数为1位数,只能用单(1)位来表示结果.
则以97除6为例,(结果为16余1,着是毫无疑问的).
结果为16余1,标志着商(16)要用两位来表示.(溢出~~).
可以这样
(9*10)/6+7/6 (和你的公式是一致的)
单方这个公式其实用我们小学的的那种手除就很直观.
_16___
6
------解决方案--------------------------------------------------------
97
6
-----
37
36
------
1
也就是将被除数分割成若干部分(这里分成2部分--9和7,你公式里的高位和低位),前一部分存商再取余乘进位+后部再除.
再以3786543除36为例.(除数用两位了)
0 10 51 81
____________
36
------解决方案--------------------------------------------------------
03 78 65 43
00
------------
3 78
3 60
------------
18 65
18 36
------------
29 43
29 16
------------
27
3786543/36=00 10 51 81 余 27
商和余都可以用两位两位的分开来装了.
其实是那么的的直接和直观,只是我们学会了复杂而习惯于复杂.
汇编中的大数运算都可以用很直接直观的方法来运算,只是要多些步骤,这是没办法的事情~~
不要谁说看不懂上面的,看不懂只能怪你自己把自己搞得很复杂了~~