当前位置: 首页 > 知识库问答 >
问题:

在早期的C和C编译器中,手动位移位与乘法和除法的相关性如何?

宦飞
2023-03-14

今天,通常最好信任编译器。但是,在简单的处理器和汇编代码的时代,程序员知道位移不仅更快,而且在编译为二进制文件时还可以节省宝贵的内存。

当C和C编译器还很年轻的时候,汇编程序员是否像在汇编中那样遵循位移位的传统,或者他们是否也可以信任编译器来优化它?由于使用了非优化的编译器,是否存在继续位移位的倾向?

今天,关于位移的观点似乎有冲突。教育方面解释了为什么它比乘法快。但是这并不总是转化为最佳代码。然而,在新旧代码的算法和表达式中发现明显的转换是很常见的。

从另一个角度来看,我对从历史中学习很感兴趣。在70、80年代,有经验的程序员是如何考虑是移位还是乘/除的?是否有某种技术使得这种努力在很大程度上过时了,比如推测性执行或分支预测?

我发现最难理解的是,我最常遇到的代码是针对非常小的常量(如1或2)进行移位的。我希望编译器最容易识别这种移位。那么为什么有人会选择仍然使用这样的移位呢?

我可能作出了一些错误的假设。我也欢迎对这个问题发表任何意见。

共有1个答案

虞正业
2023-03-14

需要记住的一件重要事情是,编译器本身必须在相当严格的内存限制下运行。如果在需要高效计算时必须使用移位,或者让编译器包含代码来优化这一点,但编译器可用于其他所有事情的存储空间较少之间做出选择,前一种选择可能会比现在更受欢迎。

 类似资料:
  • Herb Sutter的C编码标准说要避免和。但我觉得两者都在做同样的事情。因此,希望对澄清这两个概念以及它们之间的区别有所帮助。如果你能举出一些例子,对其他人会更有好处。下面是关于

  • 问题内容: 我有做乘法和加法的方法,但是我只是无法理解它们。它们都是来自外部网站,而不是我自己的: 我尝试进行逐步调试,但是对我来说确实没有多大意义,尽管它可以工作。 我可能正在寻找的是尝试并了解其工作原理(也许是数学基础?)。 编辑:这不是家庭作业,我只是想学习Java中的按位运算。 问题答案: 让我们开始看乘法代码。这个想法实际上很聪明。假设您有以二进制形式编写的n 1和n 2。然后,您可以将

  • 问题内容: 是否有C宏或某种方式可以检查我的C程序在C编译时是编译为64位还是32位? 编译器:我需要检查的GCC操作系统:Unix / Linux 另外,在运行程序时如何检查操作系统是否支持64位? 问题答案: 由于您标记了此“ gcc”,请尝试

  • 本文向大家介绍用C ++计算阶乘中的位数,包括了用C ++计算阶乘中的位数的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数值,任务是首先计算一个数字的阶乘,然后计算结果中的总位数。 什么是阶乘数 数字的阶乘是通过将数字中的数字相乘,同时将数字的值减1来计算的。它由符号“!”表示 即0!,1!,2!,3!,5!,....等 0阶乘!和1!始终为1。 例如 说明-由于阶乘值6是720并且包含3

  • 1E 1B 01 13 6 [ 0001 1110 0001 1011 0000 0001 0001 0011 0110 ]通过进行筛选和加成转换为F6C336。(0x1E 现在,我不得不逆转这一计算。即从F6C336,我想得到1E 1B 01 13 6。 很抱歉我在位操作方面的知识很差。

  • 本文向大家介绍在C ++中查找数组编号的乘积的最后k位,包括了在C ++中查找数组编号的乘积的最后k位的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个由n个元素组成的数组,称为A。我们还有另一个数字k。我们的任务是查找数组A中元素乘积的最后k位。假设A = [15、22、13、19、17],则乘积为1385670,最后k = 3位为670。 为了解决这个问题,我们将模10 k下的数字相乘。