问题描述
- 关于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.
解决方案五:
y >>2 就是除4啊
解决方案六:
这明显不等价啊,最笨的办法拿个数验证一下就知道了
解决方案七:
c的right shift是有符号shift,-1到-3的补码是1111...1 ~ 11111...01 right shift之后全部是 1111...1也就是-1.为了处理这种情况。这里先把它们变成正数。得到0.
其他小于-3的数没有问题。另外这里有人说你的代码不完整,其实是错误的。1和2就是等价的。:-D
时间: 2024-09-17 00:31:41