0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言如何用移位来解决乘除法问题

麦辣鸡腿堡 来源:轩哥谈芯 作者:Debug 2023-11-21 11:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

用移位来解决乘除法问题

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);
}

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

学会避免不必要的整数除法

整数除法是整数运算中最慢的,所以应该尽可能避免。一种可能减少整数除法的地方是连除,这里除法可以由乘法代替。这个替换的副作用是有可能在算乘积时会溢出或者丢失精度,所以只能在一定范围的除法中使用。

举个例子,不好的代码:

int i, j, k, m;
m = i / j / k;

推荐的代码: 注意精度

int i, j, k, m;
m = i / (j * k);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144602
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73144
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何对蜂鸟e203内核乘除法器进行优化

    器可以运用各种不同算法实现除法运算,例如:SRT,Newton-Raphson等。对于不同应用场景,需要选择最适合的算法,从而达到最优的处理器性能表现。 三、总结 蜂鸟E203内核乘除法器的优化是提高
    发表于 10-24 06:47

    乘除法运算

    乘除法运算本应用例的目的在于提供乘、除运算的函数及介绍乘除运算在SPMC75F2413A中的使用。应用例提供有符号和无符号数的乘除,其中包括32-Bit/16-Bit、16-Bit/8-Bit
    发表于 09-21 09:26

    单片机C语言易错知识点,记住它们会让你事半功倍

    是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如但是有时候这个问题是不明显的,比如当移位
    发表于 08-23 16:36

    C语言编程容易混淆的几个问题总结

    会出错3. 移位要防止溢出其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法
    发表于 09-18 16:17

    单片机C语言易错

    、 !和 ~ 不一样! 是逻辑非符号,~ 是位取反符号。对IO口某个引脚赋值时不要错用 !如 2、的优先级低于+、-比如要实现c=x*2+1,没有加括号会出错 3、移位要防止溢出其实用移位代替
    发表于 11-15 11:41

    C语言编程容易混淆的几个问题总结

    加括号会出错3. 移位要防止溢出其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法
    发表于 08-23 17:24

    请问单片机C语言容易出错是为什么?怎么解决?

    加括号会出错3移位要防止溢出其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法
    发表于 06-07 05:33

    浅析嵌入式C语言里的除法移位

    简单给大家分析一下嵌入式C语言编程时用到的除法移位。  除法土豪  除法在嵌入式微处理器里可算
    发表于 04-30 00:31

    请问一下C语言如何通过移位实现算术乘除

    请问一下C语言如何通过移位实现算术乘除
    发表于 10-19 06:48

    整数乘除法与位运算的效率对比分析哪个好

    文章目录01 - 为什么整数位移比乘除法高效02 - 位移和乘除法对比2.1 - 汇编代码对比2.2 - 编写复杂度对比2.3 - 速度对比03 - 例程3.1 - 例程1,单片机时钟重载值3.1
    发表于 12-24 07:33

    RISC有没有乘除法指令呢?

    RISC有没有乘除法指令呢?
    发表于 02-27 13:59

    乘除法电路

    乘除法电路 图5.4-21是乘除法运算实用电路之一。 1、A
    发表于 04-26 16:11 1.7w次阅读
    <b class='flag-5'>乘除法</b>电路

    按键移位程序【C语言版】

    按键移位程序【C语言版】按键移位程序【C语言版】按键移位
    发表于 12-29 11:04 0次下载

    关于如何提高C语言程序的执行效率

    乘除法很消耗CPU资源,查看汇编代码会发现,一个乘除法运算会编译出10几甚至几10行代码。如果是乘以或除以2的n次方,可以用>实现,这种移位运算在编译时就已经算好了,所以代码很简洁,
    的头像 发表于 06-26 16:36 7923次阅读

    汇编实现多字节乘除法

    汇编实现多字节乘除法乘法单片机的乘法本质是二进制的乘法,而乘法本身是通过加法实现的。多字节的乘法其实就是移位做加法。例如7x11,用二进制竖式表示如下图:可以看到,其实就是判断乘数的每一位是1还是0
    发表于 11-15 17:21 21次下载
    汇编实现多字节<b class='flag-5'>乘除法</b>