C语言中使用移位操作代替乘除运算效率会更高吗

发布时间:2021-11-22 15:16:07 作者:iii
来源:亿速云 阅读:344

本篇内容介绍了“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; }
C语言中使用移位操作代替乘除运算效率会更高吗

唯一的区别就是使用 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 = -3 i*3 = (i<<1) + i i*10 = (i<<3) + (i<<1)

因此,使用移位操作代替乘除法操作可能会带来预计之外的结果。而且有些移位组合也会让同事难以理解这段C语言代码的真实意图,也不利于协作开发和后期维护。

“C语言中使用移位操作代替乘除运算效率会更高吗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. Python可以代替vb吗
  2. php和java对比哪个效率更高

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:Android中ListView存在多个item样式怎么处理

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》