打印
[应用相关]

如何用精简指令集完成除以3的运算

[复制链接]
2695|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2017-10-13 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
听说精简指令集只有移位运算,加减法运算器。
那么怎么实现除以3的运算呢?
沙发
643757107|  楼主 | 2017-10-13 15:49 | 只看该作者
比如除以2吧,就是右移1位,乘以2就是左移1位。
乘以3就是=x+(x<<1)
那么除以3改怎么算呢?

使用特权

评论回复
板凳
643757107|  楼主 | 2017-10-13 15:50 | 只看该作者
求大神赐教。

使用特权

评论回复
地板
kingkits| | 2017-10-13 17:14 | 只看该作者
x /=3;

使用特权

评论回复
5
zhuotuzi| | 2017-10-13 17:18 | 只看该作者

他问的是只使用加减法和移位运算怎么实现。。

使用特权

评论回复
6
zhuotuzi| | 2017-10-13 17:19 | 只看该作者
我也想知道,不知道编译后的汇编代码能否看出来。

使用特权

评论回复
7
x1k2w3| | 2017-10-13 17:22 | 只看该作者
楼主精神可嘉,还研究这些算**

使用特权

评论回复
8
kingkits| | 2017-10-13 17:24 | 只看该作者
写段代码,有-s 参数编译一下,然后查看一下汇编源代码

使用特权

评论回复
9
kingkits| | 2017-10-13 17:26 | 只看该作者
说句实话,现在的编程真的不需要研究这个了,没RAM换RAM,没FLASH增加FLASH,速度不够可以换芯片,你只要有思路就行了。不差这几行代码

使用特权

评论回复
10
戈卫东| | 2017-10-13 17:59 | 只看该作者
如果没有除法指令,那么就只好移位/比较/相减了

使用特权

评论回复
11
zhuotuzi| | 2017-10-13 18:01 | 只看该作者
kingkits 发表于 2017-10-13 17:26
说句实话,现在的编程真的不需要研究这个了,没RAM换RAM,没FLASH增加FLASH,速度不够可以换芯片,你只要有 ...

如果要搞编译器开发,我觉得必须的研究这个简单的算法,看似简单,我也没想出来怎么做。

使用特权

评论回复
12
mmuuss586| | 2017-10-13 21:01 | 只看该作者

不知道呢

使用特权

评论回复
13
knight_21ic| | 2017-10-13 23:46 | 只看该作者
// y= x / 3

y = 0;
while (!(x<3))
{
   x -= 3;
   y++;
}

使用特权

评论回复
14
Rollo| | 2017-10-15 17:17 | 只看该作者
有除法指令的啊

使用特权

评论回复
15
643757107|  楼主 | 2017-10-19 15:37 | 只看该作者

遇到高手了,这个方法果然可以实现任意非移位除法。

使用特权

评论回复
16
643757107|  楼主 | 2017-10-19 15:37 | 只看该作者

你楼下的高人给出方法了,虽然看似简单,但是能想到真不容易,愁死我了,这个问题。

使用特权

评论回复
17
643757107|  楼主 | 2017-10-19 15:40 | 只看该作者
突然有个想法了,就是是不是可以移位,就看除数的二进制是不是只有1位是1.
比如2,4,8,16分别是0010,0100,1000,1 0000

使用特权

评论回复
18
戈卫东| | 2017-10-19 15:53 | 只看该作者
643757107 发表于 2017-10-19 15:37
遇到高手了,这个方法果然可以实现任意非移位除法。

然而如果数比较大或许会花费非常多的时间。。。。。。

使用特权

评论回复
19
643757107|  楼主 | 2017-10-19 17:08 | 只看该作者
戈卫东 发表于 2017-10-19 15:53
然而如果数比较大或许会花费非常多的时间。。。。。。

你说的对啊。所以有的单片机提供了专用的除法器。

使用特权

评论回复
20
huangcunxiake| | 2017-10-19 21:04 | 只看该作者
果然有高人,虽然笨拙,但是解决了楼主的问题,就是用有限的指令,实现复杂的功能。

使用特权

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

本版积分规则

212

主题

3780

帖子

11

粉丝