打印
[N32G45x]

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

[复制链接]
254|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
现代编译器能够很好地识别并优化移位操作,将其直接转换为硬件级别的位移指令。

使用特权

评论回复
5
biechedan| | 2024-11-8 13:36 | 只看该作者
乘法操作通常需要进行多次加法和移位操作,以及可能的进位操作,因此效率相对较低。

使用特权

评论回复
6
kkzz| | 2024-11-8 15:23 | 只看该作者
移位操作一般只需要一个机器周期,而乘法运算可能需要多个机器周期。

使用特权

评论回复
7
uptown| | 2024-11-8 17:04 | 只看该作者
移位操作通常比乘法运算更高效,这是因为移位操作在硬件层面更容易实现。

使用特权

评论回复
8
adolphcocker| | 2024-11-8 22:51 | 只看该作者
在C语言中,移位操作和乘法操作都是常见的数值操作

使用特权

评论回复
9
earlmax| | 2024-11-9 08:06 | 只看该作者
编译器也会对乘法进行优化,尤其是在乘数为常量时,编译器可能会将其转换为移位和加法的组合来提高效率。

使用特权

评论回复
10
usysm| | 2024-11-9 12:45 | 只看该作者
乘法操作的代码更加直观易懂,符合人们的常规数学思维,因此在代码的可读性和可维护性方面具有优势。

使用特权

评论回复
11
eefas| | 2024-11-9 14:46 | 只看该作者
优化可以进一步提高效率。              

使用特权

评论回复
12
maudlu| | 2024-11-9 17:21 | 只看该作者
移位操作在硬件层面上通常非常高效,因为它们直接对应于CPU的指令集。移位操作可以被视为一种简单的位操作,CPU可以直接执行,不需要复杂的计算。

使用特权

评论回复
13
pl202| | 2024-11-9 20:02 | 只看该作者
乘法运算在硬件层面的实现相对复杂,需要更多的逻辑电路和计算步骤。

使用特权

评论回复
14
rosemoore| | 2024-11-9 22:01 | 只看该作者
移位操作无法直接实现一般的乘法运算

使用特权

评论回复
15
i1mcu| | 2024-11-10 11:49 | 只看该作者
乘法操作是将两个数相乘,得到它们的乘积。这个操作通常比移位操作更复杂,因为它需要处理多个二进制位的乘积和累加。在硬件层面,乘法操作可能需要专门的乘法器电路来实现,这增加了操作的复杂性和时间成本。

使用特权

评论回复
16
robertesth| | 2024-11-10 15:22 | 只看该作者
移位操作的代码相对简洁              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

1271

帖子

0

粉丝