当前位置: 代码迷 >> 汇编语言 >> 又推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头
  详细解决方案

又推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头

热度:7844   发布时间:2013-02-26 00:00:00.0
再推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头
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进制的理解方法

其实就是上小学那种渐除法,(其实你这种也是,只是用这样表述看似很理论化.在汇编语言中的大数除法[含除数和被除数都是大数]基本都采用渐除,当然,大数除比这还要多些讲究...就略过不说了).

以10进制来理解:
假设给定被除数为2位数,除数为1位数,只能用单(1)位来表示结果.
则以97除6为例,(结果为16余1,着是毫无疑问的).
结果为16余1,标志着商(16)要用两位来表示.(溢出~~).

可以这样
(9*10)/6+7/6 (和你的公式是一致的)
单方这个公式其实用我们小学的的那种手除就很直观.

  _16___

------解决方案--------------------------------------------------------
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
商和余都可以用两位两位的分开来装了.

其实是那么的的直接和直观,只是我们学会了复杂而习惯于复杂.
汇编中的大数运算都可以用很直接直观的方法来运算,只是要多些步骤,这是没办法的事情~~

不要谁说看不懂上面的,看不懂只能怪你自己把自己搞得很复杂了~~
  相关解决方案