在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2.
因此,一些教科书建议使用移位运算而不是乘法和除法运算,因为它们可以提高最终C语言程序的效率,是真的吗?
是真的吗?
获得答案的最简单,最直接的方法是进行实验. 以下是两个有关哈希算法的C语言程序,请参见:
读者应关注h = 127 * h +(无符号字符)* s;一条线. 这时,C语言代码使用乘法. 以下是另一种C语言代码,请参见:
唯一的区别是使用h << 7移位运算而不是127 * h乘法运算
与以前的C语言代码相比,唯一的区别是使用h << 7移位运算而不是127 * h乘法运算. 在我的机器上,我测试了这两个C语言代码的效率,结果是两者几乎都快了,有时候127 * h版本的C语言代码更快了!
在C语言程序中,使用移位运算代替乘法和除法运算更快吗?现在我们对这个问题有了答案: 不是这样. 原因是C语言编译器通常会优化我们的代码. 它知道如何尽快增加目标处理器体系结构的容量,即生成最快的程序.
因此c语言移位运算,作为C语言程序员,我们应该做的是告诉编译器我们的意图(即,它是i * 2还是i << 1),并让其决定如何根据上下文生成更快的指令.
明确告诉编译器我们的意图
当硬件不支持快速乘法和除法时,编译器会将乘法和除法转换为移位和加法/减法的适当组合. 因为它了解我们的最终目的,所以有时最好告诉编译器我们的目的是明确地编写移位代码,以便获得最快的C语言程序.
实际上,有时简单的移位运算不等于乘法和除法,并且某些乘法不能通过简单的移位来实现,例如:
因此,使用移位运算代替乘法和除法运算可能会带来意外的结果. 而且某些换档组合将使同事很难理解此C语言代码的真实意图,这也不利于协作开发和后期维护.
本节讨论在C语言程序开发中移位运算与乘法和除法运算之间的关系,并讨论它们之间的效率问题. 可以看出,我们不需要在两者之间进行斗争. 实际上,考虑到代码的易读性和编译器的优化特性,我们应该编写“有意”代码,即,当我们要执行乘法和除法运算时,编写乘法和除法代码. 要执行移位操作时,请编写移位代码.
喜欢就走
如果您想很好地学习C ++,最好加入一个组织,以便每个人都可以更轻松地学习,并且可以一起交流和共享信息c语言移位运算,并为您推荐一个学习型组织: Da Niu Xiao Bai C ++组织可以单击直接可访问的编程字上
欢迎加入有趣的编程
礼品簿如下: 单击➥获取
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-270921-1.html