打印
[应用相关]

用移位来解决乘除法问题

[复制链接]
597|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jf101|  楼主 | 2024-6-27 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

a=a*4;
b=b/4;

可以改为:

a=a<<2;
b=b>>2;

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以想办法用移位的方法得到结果,如:

a=a*9

可以改为:

a=(a<<3)+a


采用运算量更小的表达式替换原来的表达式,下面是一个经典例子:

原代码:

x = w % 8;
y = pow(x, 2.0);
z = y * 33;
for (i = 0;i < MAX;i++)
{
    h = 14 * i;
    printf("%d", h);
}

修改为:

x = w & 7;                 /* 位操作比求余运算快*/
y = x * x;                 /* 乘法比平方运算快*/
z = (y << 5) + y;          /* 位移乘法比乘法快 */
for (i = h = 0; i < MAX; i++)
{
    h += 14;               /* 加法比乘法快 */
    printf("%d",h);
}

如此,对比一下执行时间会快很多。

使用特权

评论回复
沙发
kzlzqi| | 2024-7-29 15:32 | 只看该作者
使用移位操作可以显著提高代码的执行效率,尤其是在嵌入式系统和性能要求高的场景中。

使用特权

评论回复
板凳
范德萨发额| | 2024-7-29 15:41 | 只看该作者
优化代码

x = w & 7;  // 位操作比求余运算快
y = x * x;  // 乘法比平方运算快
z = (y << 5) + y;  // 位移乘法比乘法快

for (i = h = 0; i < MAX; i++) {
    h += 14;  // 加法比乘法快
    printf("%d", h);
}

使用特权

评论回复
地板
申小林一号| | 2024-7-29 22:41 | 只看该作者
感谢分享

使用特权

评论回复
5
学生会那点事ya| | 2024-8-31 22:38 | 只看该作者
位移操作在硬件上通常比乘法指令更高效,因为它不需要执行复杂的乘法运算。

使用特权

评论回复
6
位移操作还是非常方便的

使用特权

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

本版积分规则

224

主题

1529

帖子

2

粉丝