今天做这题发现一个意想不到的问题记录一下
这题主要点在于移位运算,a 除以b ,把b向左移位, 使b变大,但又不能超过a,
如下
while (a>b) b<<=1;
等循环跳出后,b已经比a大了,所以要把b还原一下, b>>=1;
但是!!! 这样是不行的!! 首先,一旦移位把int变为负数后,再怎么移都不会变为正数
举例
a = 1610612736;
a <<= 1;
a >>= 1;
你认为答案是多少? 答案是536870912
但是你用Windows计算器来做这个实验又会得到1610612736, 这里就是比较坑爹的地方了。
代码里面移位是严格按照移位来的,移位保证符号位不变;计算器则会严格移动位,不管符号位!
因为这个事情造成本题浪费大量时间, 好吧 做位运算的时候不要拿计算器验证。。 以免误导