c语言中左移和乘法谁高级,C程序员说使用移位运算代替乘法和除法更有效,是真的吗?...

10-810-jpg_6-1190.699-0-0-1190.699.jpg

在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2.

因此,一些教科书建议使用移位运算而不是乘法和除法运算,因为它们可以提高最终C语言程序的效率,是真的吗?

v2-a543faf6663f2e1fafdbe94a352dc7_b.jpg

svg

是真的吗?

e7762c015e03ecc1d7aebd31b61281ce.png

获得答案的最简单,最直接的方法是进行实验. 以下是两个有关哈希算法的C语言程序,请参见:

读者应关注h = 127 * h +(无符号字符)* s;一条线. 这时,C语言代码使用乘法. 以下是另一种C语言代码,请参见:

f720419a67f26c9eaf7e93583555667c.png

svg

唯一的区别是使用h << 7移位运算而不是127 * h乘法运算

15458e9c8f59d38527134648fd6be26e.png

与以前的C语言代码相比,唯一的区别是使用h << 7移位运算而不是127 * h乘法运算. 在我的机器上,我测试了这两个C语言代码的效率,结果是两者几乎都快了,有时候127 * h版本的C语言代码更快了!

在C语言程序中,使用移位运算代替乘法和除法运算更快吗?现在我们对这个问题有了答案: 不是这样. 原因是C语言编译器通常会优化我们的代码. 它知道如何尽快增加目标处理器体系结构的容量,即生成最快的程序.

因此c语言移位运算,作为C语言程序员,我们应该做的是告诉编译器我们的意图(即,它是i * 2还是i << 1),并让其决定如何根据上下文生成更快的指令.

de45a5bc689e39e54ff10a9846cf9f75.png

svg

9907f73c73f349ceacdb8d64a506ffaa.png

明确告诉编译器我们的意图

当硬件不支持快速乘法和除法时,编译器会将乘法和除法转换为移位和加法/减法的适当组合. 因为它了解我们的最终目的,所以有时最好告诉编译器我们的目的是明确地编写移位代码,以便获得最快的C语言程序.

实际上,有时简单的移位运算不等于乘法和除法,并且某些乘法不能通过简单的移位来实现,例如:

因此,使用移位运算代替乘法和除法运算可能会带来意外的结果. 而且某些换档组合将使同事很难理解此C语言代码的真实意图,这也不利于协作开发和后期维护.

本节讨论在C语言程序开发中移位运算与乘法和除法运算之间的关系,并讨论它们之间的效率问题. 可以看出,我们不需要在两者之间进行斗争. 实际上,考虑到代码的易读性和编译器的优化特性,我们应该编写“有意”代码,即,当我们要执行乘法和除法运算时,编写乘法和除法代码. 要执行移位操作时,请编写移位代码.

6965f9e9991b96373334b1650b323e92.gif

v2-145eac2088cf376a5a932960f6bbce6b_b.jpg

svg

喜欢就走

如果您想很好地学习C ++,最好加入一个组织,以便每个人都可以更轻松地学习,并且可以一起交流和共享信息c语言移位运算,并为您推荐一个学习型组织: Da Niu Xiao Bai C ++组织可以单击直接可访问的编程字上

欢迎加入有趣的编程

礼品簿如下: 单击➥获取

d8e6f66f0d5269964a8e71f22f303447.png

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-270921-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值