前言

大家都知道51单片机是有乘法、除法指令的,不管是用C语言还是汇编语言,都是可以直接计算乘法、除法的,我以为+,-,*,/ 这些算术运算是单片机的标配,而我公司使用的应广单片机居然没有乘法、除法指令,应广单片机使用的是mini-C语言,和C语言有点像,可以在C代码中穿插汇编指令。但mini-C不支持for循环,也不支持函数传参,所以一下代码都没有传参,也没有for循环。

乘法

思路0

我们都知道左移1位(<<1)相当于乘2,左移2位(<<2)相当于乘4,但想乘3、乘5、乘6、乘7怎么办?
在已知要乘多少时,我们可以考虑这种方法

int a=13;
b=a<<1;//b=a*2
b=(a<<1)+a;//b=a*3
b=a<<2;//b=a*4
b=(a<<2)+a;//b=a*5
b=(a<<2)+a+a;//b=a*6
b=(a<<3)-a;//b=a*7
b=a<<3;//b=a*8
//.....

思路1

前面的方法显然不是我想找的,也不是你想找的,我需要一个实现乘法的功能:a×b,a是变量,b也是变量。
再想想,例如做9×4时,我们是如何计算除法的?相信大家首先想到的是乘法口诀“四九三十六” 那是中国人太聪明了有乘法口诀,若是老外计算,可能就是“nine plus nine equals eighteen, eighteen plus nine equals twenty seven …”,乘法的本质就是把n个数相加,所以写程序的时候做循环相加即可以实现乘法计算。

byte ma;//第一个因式,这里byte等价于unsigned char
byte mb;//第二个因式
word mc;//计算结果,这里word等价于unsigned int
void mult(void)
{mc=0;while(mb){mc+=ma;mb--;}
}

很好理解,mb是几,mc就循环加几次ma,但这个方法在比较耗时,例如2×100时,2+2+2+2+…+2,这里有100次加法运算。

思路2

小学乘法的竖式计算也同样适用于二进制

因为二进制只有0或1,ma×1=ma,ma×0=0;程序中只需要:
①判断被乘数mb的最低位,若为1则mc累加ma,为0则不累加(或累加0)
②让ma左移1位,mb右移1位
③再次回到①,直到mb变为0,运算结束

word ma;//第一个因式,计算结果也存放在ma
byte mb;//第二个因式
void mult(void)
{word t=0;while(mb){if(mb.0)//if(mb&0x01){t+=ma;}ma<<=1;mb>>=1;}ma=t;
}

对于上面是程序,大大减少了计算时间,最坏情况ma*11111111B需要循环8次,一共8次累加、8次左移、8次右移。
这个程序也可以做一点优化,先比较ma、mb的大小,用大的数乘以小的数。
这样可以让0000 0001B×1111 1111B这样的乘法更快计算完成。

if(mb>ma)
{t=mb; mb=ma; ma=t;
}
t=0;

除法

思路0

通过右移指令实现÷2、÷4、÷8等,但对于除以其他数却不行了。

思路1

和乘法一样,除法也可以理解为减法。
例如:16个苹果分给5个孩子

  1. 每个孩子拿1个,还剩16-5=11个
  2. 每个孩子再拿1个,还剩11-5=6个
  3. 每个孩子再拿1个,还剩6-5=1个
    这时不够每个孩子拿1个了,所以余数是1,每个人都有3个,所以商是3。
byte ma;//被除数、商
byte mb;//除数、余数
void div(void)
{byte n=0;while(ma>mb){ma-=mb;n++;}mb=ma;ma=n;
}

这个方法对于被除数大、除数小的情况会耗时比较久。
大家可以考虑一下除数为0会发生什么,该怎么解决。

思路2

同样使用除法竖式来帮助理解


被除数高位需要对齐除数低位,再比较被除数与除数的大小决定要不要商1,但程序似乎不好写。再来看另一张图片

先将除数左移字长-1bit,就可以低位对齐并且可以相减了。
对照图片中的思路应该很好理解下面的程序。

byte ma;//被除数、商
word mb;//除数、余数
void div(void)
{word t=0;byte i=8;mb<<=7;while(i--){t<<=1;if(ma>=mb){ma-=mb;t|=0x01;//之前写错了:temp|=0x01;}mb>>=1;}mb=ma;//余数ma=t;//商
}

位移指令实现乘法、除法计算相关推荐

  1. or1200乘法除法指令解释

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 OR1200中乘法除法类指令共同拥有9条,表8.3给出了全部的乘法除法类指令的作用及说明. 说明:表8.3是ORBIS ...

  2. java中小数的乘法_javascript的小数点乘法除法实例

    javascript的小数点乘法除法实例 导语:想要学好Java语言,必不可少的就是它的四则运算,特别是乘除法.下面的是百分网小编为大家搜集的javascript的小数点乘法除法实例,希望可以帮到你. ...

  3. 计算机数值中的乘法除法原理

    乘法:被分解为左移累加. 除法:被分解为右移累减去,减法可以转换为加法. 浮点数的运算: S x 2(^F) x M 浮点数是原码表示法,S符号位,F阶码 + 127, M尾数舍弃前面的1(如果F&l ...

  4. 二进制补码乘法除法_二进制乘法和除法

    二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制 ...

  5. C语言用代码实现 简易计算器求 加法乘法除法平方根幂

    简易计算器 首先简易计算器一般都有哪些功能 以及如果用代码实现 较简单 加法:定义三个变量 输入两个变量 c=a+b 输出c即可 减法:定义三个变量 输入两个变量 c=a-b 输出c即可 乘法:定义三 ...

  6. java BigDecimal加法/减法/乘法/除法 保留两位小数

    1.BigDecimal类概述及其构造方法 由于在运算的时候,float类型和double类型很容易丢失进度,所以,为了能够精确的表示.计算浮点数,java提供了BigDecimal类   BigDe ...

  7. java精确除法计算,四舍五入 Java问题通用解决代码

    java精确除法计算,四舍五入 Java问题通用解决代码 参考文章: (1)java精确除法计算,四舍五入 Java问题通用解决代码 (2)https://www.cnblogs.com/svenne ...

  8. Intel大坑之中的一个:丢失的SSE2 128bit/64bit 位移指令,马航MH370??

    缘由 近期在写一些字符串函数的优化,兴趣使然.但是写的过程中,想要实现 SSE2 128 bit / 64 bit 的按 bit 逻辑位移.遇到了一个大坑,且听我娓娓道来. 我并不想用什么马航370来 ...

  9. 为什么python除法结果会有小数点0_为什么Python返回0进行简单的除法计算?

    为什么Python返回0进行简单的除法计算? 内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用回答 (2) 关注 (0) 查看 (296)为什么这个简单的 ...

最新文章

  1. 如何降低数据中心宕机事件的影响
  2. Serverless Kubernetes:理想,现实与未来
  3. OO实现ALV TABLE 八:ALV的布局功能
  4. CopyOnWriteArrayList源码
  5. day12装饰器进阶
  6. [整理]Git使用文章整理
  7. vs2008.net 单元测试NUnit
  8. TypeScript 函数类型参数的用法举例
  9. LeetCode --- Valid Parentheses
  10. 前端学习(2053)vue之电商管理系统电商系统之使用pm2管理
  11. 在线的pdf阅读器(javaweb)
  12. 明解C语言【中级篇】
  13. Solidworks默认模板无效问题?修改字体问题
  14. 动态获取图片色值,黑点坐标
  15. conda 速度慢 解决方案
  16. c51编译器+linux,C51 开源编译器SDCC学习笔记-安装
  17. Tensorflow系列——Saver的用法
  18. span之间的空隙怎样解决?
  19. The Shawshank Redemption-1
  20. 分布式系统基础--CAP理论

热门文章

  1. 推荐-电台- 软件无线电-图传数传一体化电台
  2. 基于JAVA中山乡村文化旅游网络平台计算机毕业设计源码+系统+lw文档+部署
  3. 2019杭师大程序设计竞赛 赛后感悟
  4. 盛世传奇找不到服务器,1.80盛世传奇
  5. segmentation fault 常见原因
  6. 网站分类目录你常用的标签是什么意思?
  7. Android中的文件存储问题
  8. 下载B站视频的一次经验
  9. python爬虫框架:scrapy抓取企业名录
  10. 佛家经典语录 - 佛的告诫