打印

关于匠人“巧用移位法进行多字节乘除法”的几点疑问

[复制链接]
4227|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmonth|  楼主 | 2012-5-14 15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我要做一个8字节除4字节无符号数的程序,看了匠人的“巧用移位法进行多字节乘除法”,有几个疑问(关于除法的):
1.匠人写的“试商:C=1,或余数大于等于除数”则“余数=余数-除数”,如果C=1,余数小于除数应如何处理,我用的是无符号数,是用除数-余数吗?
2."计数器=除数位数",好像应该为“计数器=被除数位数”,我做8字节除4字节,如果计数器=32,结果不对,用计数器=64就对了,是不是应该为“计数器=被除数位数”

相关帖子

沙发
ayb_ice| | 2012-5-14 15:42 | 只看该作者
8个字节应该是64

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sunmonth + 1
板凳
sunmonth|  楼主 | 2012-5-14 15:52 | 只看该作者
谢谢楼上,第1个问题应该咋做?

使用特权

评论回复
地板
程序匠人| | 2012-5-14 15:55 | 只看该作者
1.匠人写的“试商:C=1,或余数大于等于除数”则“余数=余数-除数”,如果C=1,余数小于除数应如何处理,我用的是无符号数,是用除数-余数吗?


答复:余数小于除数,则不需要做减法,直接令c=0,见流程图。


2."计数器=除数位数",好像应该为“计数器=被除数位数”,我做8字节除4字节,如果计数器=32,结果不对,用计数器=64就对了,是不是应该为“计数器=被除数位数”

答复:你看到的可能是老的版本。在《匠人手记》勘误表中已经指出过此点笔误了。

使用特权

评论回复
5
sunmonth|  楼主 | 2012-5-14 15:59 | 只看该作者
“余数小于除数,则不需要做减法”
是不是“试商:C=1,或余数大于等于除数”应为“试商:余数大于等于除数”

使用特权

评论回复
6
程序匠人| | 2012-5-14 16:01 | 只看该作者
“余数小于除数,则不需要做减法”
是不是“试商:C=1,或余数大于等于除数”应为“试商:余数大于等于除数”
sunmonth 发表于 2012-5-14 15:59


这句话的意思是,如果C=1,或者余数大于等于除数。则……
两个条件,任意一个满足即执行Y分支,否则执行N分支。

使用特权

评论回复
7
sunmonth|  楼主 | 2012-5-14 16:11 | 只看该作者
任意满足一个,如果满足C=1,不满足余数大于除数

余数=余数-除数  

不够减,应该如何做?

使用特权

评论回复
8
sunmonth|  楼主 | 2012-5-14 16:12 | 只看该作者
我用的是无符号数除法

使用特权

评论回复
9
程序匠人| | 2012-5-14 16:13 | 只看该作者
任意满足一个,如果满足C=1,不满足余数大于除数

余数=余数-除数  

不够减,应该如何做?
sunmonth 发表于 2012-5-14 16:11


怎么可能不够减呢?别忘了C=1。  :)
也就是说不够减可以向c借位。

使用特权

评论回复
10
sunmonth|  楼主 | 2012-5-14 16:16 | 只看该作者
本帖最后由 sunmonth 于 2012-5-14 16:18 编辑

C=1,这个C是移位前的余数最高位,移位后可能就不够了

使用特权

评论回复
11
sunmonth|  楼主 | 2012-5-14 16:17 | 只看该作者
例如余数为0x80000000,移位后为余数0,C=1,

这时就不够减了

使用特权

评论回复
12
程序匠人| | 2012-5-14 16:20 | 只看该作者
指令系统在做减法的时候,如果发生了不够减的情况,会自动借位。所以,你不必担心这个问题。


另外,看你的意思,你是打算用c语言实现这段代码?


我的流程图是面向汇编的。

使用特权

评论回复
13
sunmonth|  楼主 | 2012-5-14 16:21 | 只看该作者
明白了

使用特权

评论回复
14
sunmonth|  楼主 | 2012-5-14 16:22 | 只看该作者
不管够不够都要减
我用C51处理的,验证也是对的

使用特权

评论回复
15
程序匠人| | 2012-5-14 16:23 | 只看该作者
不管够不够都要减
我用C51处理的,验证也是对的
sunmonth 发表于 2012-5-14 16:22


管够不够都要减——理解正确!

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sunmonth + 1
16
sunmonth|  楼主 | 2012-5-14 16:26 | 只看该作者
谢谢2楼和匠人

结贴如何给分?

匠人帮我给分吧,2楼和匠人每人10分

使用特权

评论回复
17
程序匠人| | 2012-5-14 16:53 | 只看该作者
谢谢2楼和匠人

结贴如何给分?

匠人帮我给分吧,2楼和匠人每人10分
sunmonth 发表于 2012-5-14 16:26


我没办法帮你结贴。需要你自己操作。

在帖子标题下有个 “我要结贴” 点击,为每个楼分配分数,再回到上面确认。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

192

帖子

0

粉丝