能力值:
( LV9,RANK:610 )
|
-
-
2 楼
遗漏说明一下 :最终公式只对负数有效
正数是这个样子:Idata/(2^n) = YWn(idata)
|
能力值:
( LV9,RANK:180 )
|
-
-
3 楼
6个多小时 不顶说不过去
|
能力值:
( LV9,RANK:610 )
|
-
-
4 楼
还不是脑袋转不过弯来 要是脑袋转的快 估计一会就能想明白了 呵呵
S大 帮看看有没有什么错误啊 万一错了 误导别人就不好了
|
能力值:
(RANK:350 )
|
-
-
5 楼
支持blueapplez
一堆公式看得有点晕
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
看过类似的,没看过这么透彻的
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
对于公式Idata/(2^n)=YWn(idata+2^n-1)
有一点需要说明,即intel使用的有符号除法的商是采取向零圆整的方式(如:(-5)/2=-2……-1,5/2=2……1),所以对于不能整除的数,移位的结果与商差1。这就是移位前加上(2^n-1)的原因。
由于不会使用论坛功能,把解释的内容粘贴到这里就走样了,所以放入附件。
对于这个公式理解后面加(2^n-1)的原因不是太难,难的是当初如何想到加(2^n-1)而不是别的数,向先驱们致敬!
向lz的专研精神致敬!
|
能力值:
( LV9,RANK:140 )
|
-
-
8 楼
牛b啊,偶像啊
|
能力值:
( LV9,RANK:610 )
|
-
-
9 楼
to:fonilye
对于公式Idata/(2^n)=YWn(idata+2^n-1) 有一点需要说明,即intel使用的有符号除法的商是采取向零圆整的方式(如:(-5)/2=-2……-1,5/2=2……1),所以对于不能整除的数,移位的结果与商差1。这就是移位前加上(2^n-1)的原因。
这里是不是要分正数负数呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
对,正数的补码是其本身,除法和移位的结果是相同的,不需要修正(就是你第二帖中提出的那个正数公式)。
但对负数的补码,除法和直接移位的结果并不相同,如果用移位代替除法的话,可能需要修正(视移出部分是否为零而定)。我前一帖的解释只是对你提出的负数那个公式。
呵呵,是我的表述有问题
|
能力值:
( LV3,RANK:30 )
|
-
-
11 楼
我的理解就是整数 /2 ....余数 随他怎么变。 公式不变!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
不错,对看反汇编代码很有帮助!
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
<code>
Mov eax, idata ;idata表示一个整数
Add eax, (eax的符号位)*(2^n - 1) ;这里n=4
Sar eax, n
</code>
你的这一段代码写得非常好. 但是似乎应该是反过来的:
<code>
Mov eax, idata ;idata表示一个整数
Add eax, -(eax的符号位)*(2^n - 1) ;这里n=4
Sar eax, n
</code>
或者
<code>
Mov eax, idata ;idata表示一个整数
SUB eax, (eax的符号位)*(2^n - 1) ;这里n=4
Sar eax, n
</code>
----------------------------------------------------------
即最后的结果是
1>如果 被除数 为 非负数 时候, 直接为
<code>
Sar eax, n ; eax为被除数, 除数为 2^n
</code>
2>如果被除数 是负数时候, 为:
<code>
Mov eax, idata
ADD eax, (2^n - 1)
Sar eax, n
</code>
|
|
|