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

①y/4

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

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

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

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

3 就是 y/4 中的 4 -1

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

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

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