前两天突发奇想,写一个乘法的实现,但不用乘号*。并测试一下性能如何。因此就有了下面的代码:(本文主要目的是为了玩递归和位移,因此仅限自然数)

首先,标准乘法:

1 int commonMultiplication(int a, int b) => a * b;

第二,从数学的角度,乘法其实就是加法,只是加法的简写而已,因此 a * b 可以理解为 b 个 a 相加;故得出用加法代替的乘法。为了减少加法的次数,取 a, b 两数的最小值进行循环:

1 int plusMultiplication(int a, intb) {2 var t = a > b ? b : a, r = 0;3 if (t ==a) {4 a =b;5 b =t;6 }7

8 while (b-- > 0) r +=a;9 returnr;10 }

最后,位移乘法。计算机进行位移操作的速度是非常快的,因此,如果能把乘法换算成位移操作的话,速度会不会更快?但是根据计算机二进制的特点,每次向左位移,相当于是乘了2的n次方,怎么办?我们看看例子:

31 * 18

怎么用位移来实现呢?首先我们取小的数:18,进行拆解。拆解的算法是,任何一个自然数,在计算机中都可以用二进制表示,那么,任何一个自然数,也可以拆解为2的幂的和。比如 18 的二进制表示 为  10010,拆解成十进制,即为 18 = 16 + 2;那么上面可以拆解为:

31 * 18 = 31 * (16 + 2) = 31 * 16 + 31 * 2

此时即可换成位移的算法:

31 * 18 = 31 * (16 + 2) = 31 * 16 + 31 * 2 = 31 * 2^4 + 31 * 2^1 = (31 << 4) + (31 << 1)

是不是转成了位移?这里要注意对乘数 18 的处理,位移的关键是找到乘数 b 如何拆解为 2 的幂,这里要递归拆解,以18为例,第一次的关键是找到16这个2的幂,然后用18 - 16,结果等于 2,继续找2等于多少2的幂,直到差小于2为止。同时,考虑到a*b,在实际计算中即使小的乘数也很大的情况,采用类似二分搜索的方式,给定阶数,从大的阶数向小的阶数递归。阶数的设定可以参考计算机的位数,即32位还是64位。因此,计算一个数可以拆分出来的最大2的幂的代码如下:

1 int _bitShift(int d, intorder) {2 if (order == 0) return 0;3 var i = 0;4 for (var t = d; (t >>= order) > 0; d = t, t = d) i +=order;5 return i + _bitShift(d, order >> 1);6 }

位移乘法实现的代码

int bitMultiplication(int a, int b, intorder) {

var t= a > b ? b : a, r = 0;if (t ==a) {

a=b;

b=t;

}for (var i = _bitShift(b, order); i > 0; i =_bitShift(b, order)) {

r+= a <

b-= 1 <

}return b == 1 ? r +a : r;

}

经过采用随机大数进行多次循环测试,结果显示,用加法实现的乘法速度最慢,最快的仍然是 普通乘法,即用乘号的乘法;位移乘法居中。看来底层的计算机指令还是对*乘法做了优化。

最后说明一下,本文纯属原创,没有使用dart 自带math包,尤其是在求一个数可以拆出来的最大的2的幂的数字时。否则直接用math包中的log函数即可得出结果,但这样就起不到自己练习位运算和递归的目的了。

python 乘法不用乘号_递归算法之不用乘号的乘法——用位移实现乘法(dart语言实现)...相关推荐

  1. vba九九乘法表代码_【VBA实例】在立即窗口获得九九乘法口诀

    1.案例说明 在早期的Basic版本中,程序运行结果主要依靠Print语句输出到终端.在VB中,Print 作为窗体的-一个方法,用来在窗体中显示信息.但是在VBA中,用户窗体已经不支持Print 方 ...

  2. 程序语言python的优化版_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例...

    Sentry 是一个帮助在线业务进行监控及错误分析的云服务,它每月处理超过十亿次错误.我们已经能够扩展我们的大多数系统,但在过去几个月,Python 写的 source map 处理程序已经成为我们性 ...

  3. python古诗朝代_用 Python 编写中国历史知识库,此时不用中文命名变量更待何时?...

    原标题:用 Python 编写中国历史知识库,此时不用中文命名变量更待何时? 早先想做个以中国历史为背景的小游戏,但苦于没找到现成已结构化的历史数据.理想中的需要有人物(包括基本信息.人物关系).事件 ...

  4. python实现抢劵_用Python实现微信自动化抢红包,再也不用担心抢不到红包了

    1. 概述 刚刚收到了两个消息,一个好消息,一个坏消息. 先说好消息,好消息就是微信群里有人要发红包,开心~ 不过转念一想,前几次的红包一个都没抢到,这次???不由自主的叹了一口气 ... 过了一会, ...

  5. python清理垃圾_用Python自动清理系统垃圾,再也不用360安全卫士了

    用Python自动清理系统垃圾,再也不用360安全卫士了 在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:.tmp.._mp)日志文件(.log).临时帮助文件(.gid ...

  6. python黑科技脚本_利用Python实现FGO自动战斗脚本,再也不用爆肝啦~

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 利用Python实现FGO自动战斗脚本,再也不用爆 ...

  7. 360软件管家怎么下载python_用Python自动清理系统垃圾,再也不用360安全卫士了

    用Python自动清理系统垃圾,再也不用360安全卫士了 在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:.tmp.._mp)日志文件(.log).临时帮助文件(.gid ...

  8. bilibili有电脑版吗_你体验过电脑版的《和平精英》吗?不用担心内存,也不用担心卡顿...

    大家好,欢迎来到<刺激实战教室>,我是你们的老朋友刺激哥.不知道大家在玩<和平精英>的时候,有没有体验过电脑版的<和平精英>. 刺激哥在搜索<和平精英> ...

  9. python学习之旅_第2天

    学习目标: 三天掌握 python 入门知识 学习内容: 1. Python3 迭代器与生成器 2. Python3 函数 3. Python3 数据结构 4. Python3 模块 5. Pytho ...

最新文章

  1. IMAP IDLE模式(推送邮件)
  2. 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )
  3. 编码导致 html和aspx 样式差异,变形
  4. python pyqt5 线程 暂停 重启_PyQt5 线程阻塞?
  5. html的opacity标签,css中opacity是什么意思
  6. 面试从开始到结束, 必备的一些小技巧
  7. python接口自动化参数化_python接口自动化6-参数化关联
  8. 【转载】手动删除引用nuget如何还原
  9. 最简单的基于FFmpeg的内存读写的例子:内存播放器
  10. 20. Django进阶:生成csv文件
  11. 计算机组成原理统一试卷,安阳工学院计算机组成原理试卷a
  12. 蚂蚁课堂:Consul搭建
  13. plc vb c语言编程,【实例】VB实现plc与上位机通讯应用程序
  14. 若启用该计算机上的无线功能 请使用,无线网络启用后还显示已禁用怎么办_常见问题解析...
  15. 基于android的校园二手交易平台的设计
  16. LeetCode237——删除链表中的节点
  17. 租客儿子高考608分,房东送上大礼“免租4年”
  18. mysql 黑名单_51ak带你看MYSQL5.7源码4:实现SQL黑名单功能
  19. 2022 manjaro安装中文输入法
  20. 利用关联网络,防控信用卡“养卡套现”

热门文章

  1. 自动驾驶的重要一环:谈谈感知前沿技术
  2. 苹果春季发布会提前曝光:紫色iPhone 13 Pro冲上热搜,SE3将搭载A15芯片
  3. Java创建JSON对象
  4. 贝叶斯分类器原理——学习笔记
  5. 今天我们来聊聊:MD5 到底是不是加密?
  6. Python Web 深度学习实用指南:第一、二部分
  7. 盲盒APP商城营销的演变
  8. 无效广告流量知多少?
  9. 刷题记录7.20 青蛙们跳台阶
  10. 彻底理解浏览器的Http缓存机制