[N32G45x] C语言中移位操作的效率与乘法比较

[复制链接]
 楼主| ingramward 发表于 2024-10-31 22:30 | 显示全部楼层 |阅读模式
今天用GCC做了几个小测试有一点发现,提供给大家参考。
现有两个变量
LONG A;
CHAR B;

1 需要进行如下运算:
A=A*16+B;   
如果改用
A=(A<<4)+B;
到底那个快?
结果:A=(A<<4)+B;快一些。
原因:长整型乘法运算比较慢。

2 需要进行如下运算:
A=A*256+B;   
如果改用
A=(A<<8)+B;
到底那个快?
结果:A=(A<<8)+B;快很多。
原因:在A=(A<<8)+B;中,程序自动将A的高三字节采用赋值传递,所以大量地节省了运算时间。

3 增加变量C,需要进行如下运算:
C=256;
A=A*C+B;   
如果改用
C=8;
A=(A<<C)+B;
到底那个快?
结果:A=(A*256)+B;快。
原因:由于移位的位数保存在变量C中,程序无法采用针对性的优化,只得采用循环的逐位移动,造成移动位数多时速度降低。

结论
    看起来不能简单地认为移位运算就比2的幂乘法快,还需要根据移位的多少来具体分析,乘数比较大时,移位次数增多,采用循环的逐位移动速度反而不高,而移位次数少时效率还可以,当移位次数为8或16时则可能获得最大的效率。

plsbackup 发表于 2024-11-7 20:55 | 显示全部楼层
一般来说,移位操作通常比乘法操作更快,因为它们可以直接由硬件实现,而乘法操作可能需要更多的时钟周期来完成。
jackcat 发表于 2024-11-8 10:57 | 显示全部楼层
移位操作比乘法操作更快,因为它们可以直接由硬件实现,而不需要复杂的乘法器电路。
wangdezhi 发表于 2024-11-8 12:40 | 显示全部楼层
现代编译器能够很好地识别并优化移位操作,将其直接转换为硬件级别的位移指令。
biechedan 发表于 2024-11-8 13:36 | 显示全部楼层
乘法操作通常需要进行多次加法和移位操作,以及可能的进位操作,因此效率相对较低。
kkzz 发表于 2024-11-8 15:23 | 显示全部楼层
移位操作一般只需要一个机器周期,而乘法运算可能需要多个机器周期。
uptown 发表于 2024-11-8 17:04 | 显示全部楼层
移位操作通常比乘法运算更高效,这是因为移位操作在硬件层面更容易实现。
adolphcocker 发表于 2024-11-8 22:51 | 显示全部楼层
在C语言中,移位操作和乘法操作都是常见的数值操作
earlmax 发表于 2024-11-9 08:06 | 显示全部楼层
编译器也会对乘法进行优化,尤其是在乘数为常量时,编译器可能会将其转换为移位和加法的组合来提高效率。
usysm 发表于 2024-11-9 12:45 | 显示全部楼层
乘法操作的代码更加直观易懂,符合人们的常规数学思维,因此在代码的可读性和可维护性方面具有优势。
eefas 发表于 2024-11-9 14:46 | 显示全部楼层
优化可以进一步提高效率。              
maudlu 发表于 2024-11-9 17:21 | 显示全部楼层
移位操作在硬件层面上通常非常高效,因为它们直接对应于CPU的指令集。移位操作可以被视为一种简单的位操作,CPU可以直接执行,不需要复杂的计算。
pl202 发表于 2024-11-9 20:02 | 显示全部楼层
乘法运算在硬件层面的实现相对复杂,需要更多的逻辑电路和计算步骤。
rosemoore 发表于 2024-11-9 22:01 | 显示全部楼层
移位操作无法直接实现一般的乘法运算
i1mcu 发表于 2024-11-10 11:49 | 显示全部楼层
乘法操作是将两个数相乘,得到它们的乘积。这个操作通常比移位操作更复杂,因为它需要处理多个二进制位的乘积和累加。在硬件层面,乘法操作可能需要专门的乘法器电路来实现,这增加了操作的复杂性和时间成本。
robertesth 发表于 2024-11-10 15:22 | 显示全部楼层
移位操作的代码相对简洁              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

1519

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部