小程序 const moment = require('moment')_有C语言程序员说,使用移位操作代替乘除运算效率更高,真的吗?...
在C语言程序开发中,一些移位操作似乎可以达到与乘除法操作一样的效果。例如,4>>1 等于 2,此时右移一位相当于除以 2。类似的,2<<1 等于 4,此时左移一位相当于乘以 2。
因此,有些教材推荐使用移位操作代替乘除操作,称可以为最终的C语言程序带来效率上的提升,那么真的如此吗?
真的如此吗?
移位代替乘除,C语言程序效率更高吗?
得到答案最简单直接的方法是做实验,下面是两段关于哈希算法的C语言程序,请看:
unsigned int hash( char const* s ){ unsigned h = 0; while ( *s != '0' ) { h = 127 * h + (unsigned char)*s; ++ s; } return h;}
读者应将注意力放在h = 127 * h + (unsigned char)*s;一行,此时C语言代码使用的是乘法操作。下面是另外一段C语言代码,请看:
unsigned int hash( char const* s ){ unsigned h = 0; while ( *s != '0' ) { h = (h << 7) - h + (unsigned char)*s; ++ s; } return h;}
唯一的区别就是使用 h<<7 移位操作代替了 127 * h 乘法操作
与前面那段C语言代码相比,唯一的区别就是使用 h<<7 移位操作代替了 127 * h 乘法操作。在我的机器上,我测试了这两段C语言代码的效率,结果是两者差不多快,有时 127 * h 版本的C语言代码更快!
解析
C语言程序中,使用移位操作代替乘除操作更快吗?现在这个问题我们已经有答案了:并不如此。原因在于C语言编译器一般都会优化我们的代码,它知道如何尽可能快地增加目标处理器体系结构的能力,也即尽量生成尽可能快的程序。
因此作为C语言程序员,我们应该做的是明确告诉编译器我们的意图(即到底是 i * 2,还是 i<<1),让它根据上下文决定如何产生更快的指令。
明确告诉编译器我们的意图
当硬件不支持快速乘除法时,编译器会将乘除法转换为移位和加法/减法的适当组合。因为它知道我们的最终目的,所以有时候显示的写出移位代码,倒不如直接告诉编译器我们的目的,这样才能得到尽可能快的C语言程序。
事实上,有时候简单的移位操作并不等同于乘除法,而且有些乘法并不能通过简单的移位实现,例如:
-5 / 2 = -2-5 >> 1 = -3i*3 = (i<<1) + ii*10 = (i<<3) + (i<<1)
因此,使用移位操作代替乘除法操作可能会带来预计之外的结果。而且有些移位组合也会让同事难以理解这段C语言代码的真实意图,也不利于协作开发和后期维护。
小结
本节讨论了C语言程序开发中,移位操作与乘除法操作的关系,并讨论了它们之间的效率问题。可以看出,我们并不需要纠结二者之间的取舍。事实上,考虑到代码的易读性和编译器的优化特性,我们应该写出“本意”代码,即:希望实现乘除操作时,就写出乘除代码。希望实现移位操作时,就写出移位代码。
点个赞再走吧
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
小程序 const moment = require('moment')_有C语言程序员说,使用移位操作代替乘除运算效率更高,真的吗?...相关推荐
- 小程序 const moment = require('moment')_小程序依赖分析实践
用过 webpack 的同学肯定知道 webpack-bundle-analyzer ,可以用来分析当前项目 js 文件的依赖关系. webpack-bundle-analyzer 因为最近一直在做小 ...
- 小程序 const moment = require('moment')_开源小程序精选
我最近在做二人对战模式答题,体验了不少小程序,找到一个开源的,现推荐给大家 小程序代码地址 微信小程序云开发实现的单词PK小程序,支持好友对战.随机匹配.人机模式,完整代码 ~ UI可以披靡市场上所有 ...
- 怎么用centos7运行c语言程序_写C语言程序,如何提升程序运行效率?我的一点经验分享给你们!...
在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考: 1.C于代码在程序中的优化 现在的C编译器会自动对代码进行优化,但这些优化是对执行速度和代码 ...
- 工作效率 工具_我使用的工具加快了我的工作流程,使我的工作效率更高
工作效率 工具 by Egwuenu Gift 通过Egwuenu礼物 我使用的工具加快了我的工作流程,使我的工作效率更高 (The tools I use speed up my workflow ...
- 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?
可运行的c语言程序的扩展名为".exe".c语言程序经过"编译程序"编译之后,生成一个后缀为".obj"的二进制文件:然后由"连接 ...
- 锤子手机Android auto,分享锤子手机Smartisan OS的几个使用小技巧,效率更高
原标题:分享锤子手机Smartisan OS的几个使用小技巧,效率更高 老罗创办的锤子科技一直以来都追求着效率的提升和不随流俗的设计美感,锤子手机基于安卓深度定制的系统Smartisan OS正是体现 ...
- 8255A红绿灯c语言程序,51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序).doc...
51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序) 51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序)2010-04-21 22:0 ...
- android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...
很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后, 问我是怎么做的.我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空.正好现在放假了,而且离回 ...
- lua运行外部程序_在C语言程序中嵌入Lua脚本
第一次知道Lua语言,是上个月在书城的时候,看到一本名为<魔兽世界编程宝典>的书.心想,魔兽世界还能编程?难道是自己编一个魔兽世界出来?翻开一看,原来是编写插件,用的是一种叫Lua的脚本语 ...
最新文章
- extjs 计算日期之和_财报分析之利润表的重构(2)——以医药制造行业为例
- STM32 C/C++ uCOSII 函数调用return 无法返回或者函数无法正常反回上一层函数的问题
- mysql5.623 GTID主从复制+半同步复制安装与配置
- 遍历List过程中同时修改
- 信息学奥赛一本通(1090:含k个3的数)
- 数字在排序数组中的出现次数
- 【协同任务】基于matlab蚁群算法多无人机攻击调度【含Matlab源码 034期】
- PostgreSQL 为什么不要滥用unlogged table hash index
- cocos2d-x传智播客_Hanselminutes播客30-Outlook加载项和个人生产力增强器
- 合唱队形(c++DP)
- mysql多进程模块型_mysql mysqld_multi 单机多进程
- 错误的英语提示翻译 以及经常犯的无错误
- matlab抢占时隙算法,基于汉明重分组的动态帧时隙ALOHA防碰撞算法
- 程序员必备注释模板——“佛祖保佑 永无bug“
- 如何使用帆软BI直接分析明道云数据
- Linux C 遍历目录下的所有文件
- 将个人微信公众号变成查券返利机器人完美教程分享
- C语言中的int类型的范围是由什么决定的
- 机器学习之Kmeans
- 第6周 使用对象 1 单词长度(5分) 2 GPS数据处理(5分)