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