C语言编程技巧 --- C语言中左移右移与乘除法的比较

C语言中右移与除法的比较

        最近在做项目的时候,遇到了一个有趣的现象。那就是,对于除2的整数次幂的操作而言,为了加快计算速度,一般情况下,会用右移(>>)来替代除法(/)。但实际上,在VS中,右移等价于matlab中的floor(地板)操作,即,向负无穷大方向取整

Part I: 除法与右移

首先看看被除数为负数的情况:

1,-3/2 = -1.5

对于除法而言,-3/2等于-1,相当于直接截断小数位,没有四舍五入。

对于右移而言,-3>>1等于-2,可能是四舍五入(-0.5),可能是向负无穷-Inf方向取整,但没有截断。

2,-7/4 = -1.75

对于除法而言,-7/4等于-1,同样,直接截断小数位,没有四舍五入。

对于右移而言,-7>>2等于-2,可能是四舍五入(-0.75),可能是向负无穷-Inf方向取整,但没有截断。

3,-5/4 = -1.25

对于除法而言,-5/4等于-1,直接截断。

对于右移而言,-5>>2等于-2,证明之前的计算并没有四舍五入(-0.25),一定是向负无穷-Inf方向取整,等同于matlab中的floor。

小结:对于被除数为负数的情况而言,右移不等价于除法,除法是直接截断了小数部分,而右移动是floor。

被除数为正数的情况:

1,3/2 = 1.5

对于除法而言,3/2等于1,和被除数为负数的结果一样,唯一的差异就是正负号,依然是截断。

对于右移而言,3>>1等于1,这和被除数为负数的结果不一样。从1.5到1,再一次证明了右移的做法是在向负无穷-Inf方向取整。

2,7/4 = 1.75

对于除法而言,7/4等于1,直接截断。除了符号不同,和被除数为负数的结果一样。

对于右移而言,7>>2等于2,从1.75到1,向负无穷-Inf方向取整。

3,5/4 = 1.25

对于除法而言,5/4等于1,直接截断,和被除数为负数的结果一样。

对于右移而言,-5>>2等于-2,从1.25到1,等同于floor,向负无穷-Inf方向取整。

小结:对于被除数为正的情况,右移的结果等于除法。对于正数而言,除法直接截断的效果等同于向-inf方向取整。

总结:

        对于除法而言,无论被除数是正还是负,结果是相同的。对于右移而言,被除数是正数和负数时,结果是不同的。

Part II: 乘法与左移

        因为,乘法的计算中不存在小数,所以,左移和乘法对正数和负数得到的结果都是一样的。


 (全文完)

作者 --- 松下J27

 (配图与本文无关)

版权声明:文中的部分图片,文字或者其他素材,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27
 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松下J27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值