在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

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

  1. c语言左移15位,关于c语言中左移右移运算符的问题

    参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...

  2. c语言中左移右移有什么作用,C语言中左移和右移运算符详细介绍

    搜索热词 C语言中左移和右移运算符详细介绍 左移运算符(< 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出 ...

  3. 高级 Java 程序员都在学什么?

    我曾在某乎的一条回答下看到这样一条评论: 确实,Netty 大家肯定都会,不会的绝对是初级或者XX 上面的说有失偏颇,学习技术没必要上升到人身攻击,更重要的是如何学会技术,面好的大厂,拿到高的薪资. ...

  4. Verilog学习之移位运算与乘法设计

    文章目录 前言 一.题目描述 二.实现思路 1.理解移位运算与状态机 1)移位运算 1>算数移位 2>逻辑移位 2)状态机 1>什么是状态机 2>状态机的类型 Moore 型状 ...

  5. 高级PHP程序员应该掌握哪些技术?

    高级PHP程序员应该具备哪些技能? 我觉得高级PHP程序员至少应该具备如下能力: 操作系统 熟悉操作系统的作用,以及其如何管理软硬件的熟悉进程和线程,以及相互之间的区别和联系熟悉Linux中进程线程切 ...

  6. 如何才能进阶高级Java程序员?

    身为程序员,一旦进入技术行列,就开启了持续学习的道路,更迭迅速的互联网时代,技术自然也是一代一代的更新,在技术进阶的道路上,要不断吸收新的想法和技术知识.进阶高级Java程序员要怎么做,不如跟着千锋重 ...

  7. 想成为高级PHP程序员,需要掌握哪些技术呢

    转自:微点阅读  https://www.weidianyuedu.com/content/1217215138119.html 高级PHP程序员应该具备哪些技能? 我觉得高级PHP程序员至少应该具备 ...

  8. 高级php程序员,php高级程序员该学什么

    高级PHP程序员 重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习.(纵深维度发展) (推荐学习:PHP视频教程) 目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术 ...

  9. 中国都有哪些顶级优秀的程序员?

    中国都有哪些顶级优秀的程序员? 91.com移动互联网第一平台时间:2017-05-27[网站合作]快速评论关注91 相关搜索: 科学家第二次警告 小海绵正面照曝光 红通张靖川投案 3名男子香港遇袭 ...

最新文章

  1. 期末Java面向对象程序设计复习稳过不挂指南(更新中)
  2. static 变量初始化顺序的问题和解决方案
  3. 第二十六讲:基础一开放封闭原则
  4. php阳历转阴历(农历),阴历转阳历的方法
  5. 宇宙无敌大招呼 (5 分)
  6. 安卓QQ闪照解密秒存助手
  7. flash builder 序列号
  8. SSD目标检测算法生成8732个先验框
  9. TB6612驱动电机
  10. R语言进行系统聚类分析并作图(数据来源国家统计局)
  11. Windows设置开机自启动的三种方式
  12. 适合程序员的英文名字
  13. 浅析信号与系统2(离散时间复指数序列的周期性质)
  14. php对接微博热搜,基于PHP爬虫的微博热搜实时监控平台
  15. ipv6如何测试服务器已经是ipv6协议,怎么测试域名是否支持ipv6
  16. java-数组-输出二十六个字母
  17. 2023最新素材解析网站源码搭建和原理,附带PHP小例子。
  18. CCF CSP 201609-2 火车购票 C++实现 100分
  19. 翻斗式雨量计的组成与工作原理
  20. java I/O流

热门文章

  1. Faster-rcnn中Anchor的理解
  2. 神经网络的基本原理,神经网络算法三大类
  3. TPS和事务响应时间的关系、计算公式
  4. 杭州区块链技术与应用联合会简报
  5. 老码农眼中的大模型(LLM)
  6. 学习编程先学什么?怎么学习编程?
  7. sprintf, snprintf, _snprintf, sprintf_s 等的区别
  8. request_standard_resources
  9. 5大模块带你了解视频后台设计(含推荐策略)
  10. Codeforces 115 B Lawnmower【思维】