2 maoxunxing maoxunxing 于 2014.11.25 23:53 提问

关于C语言除法的一个优化问题
c

①y/4

if(y<0) y+=3;y >>= 2

①和②为什么是等价的?那个3是怎么弄出来的?

7个回答

caozhy
caozhy   Ds   Rxr 2014.11.26 00:04

代码不完整,二进制计算中,右移1位就是整除2,2位就是整除2再整除2(也就是4),以此类推。好比十进制中,小数点往右每移动一次,就是除以10,移动2个数字就是除以100。

maoxunxing
maoxunxing 谢提醒。
接近 3 年之前 回复
caozhy
caozhy   Ds   Rxr 2014.11.26 00:13

你确认你的代码贴全了么?显然这个根本不相干,不要说等价了。

91program
91program   Ds   Rxr 2014.11.26 07:22

3 就是 y/4 中的 4 -1

相当于除法,+3是为了处理余数。

91program
91program   Ds   Rxr 2014.11.26 07:23

补充一下,>>1 相当于除2,所以 >>2 相当于除4.

wll381200
wll381200   2014.11.26 13:46

y >>2 就是除4啊

g302syy
g302syy   2014.11.26 21:41

这明显不等价啊,最笨的办法拿个数验证一下就知道了

eagleyan
eagleyan   Rxr 2014.11.30 11:45

c的right shift是有符号shift,-1到-3的补码是1111...1 ~ 11111...01, right shift之后全部是 1111...1也就是-1.为了处理这种情况。这里先把它们变成正数。得到0.
其他小于-3的数没有问题。另外这里有人说你的代码不完整,其实是错误的。1和2就是等价的。:-D

Csdn user default icon
上传中...
上传图片
插入图片