最近在刷oj,在双指针的问题上,求中间位置索引mid总喜欢用mid = (L + R) / 2
,这样好像没什么不对的,但是今天看左神的代码发现他并没有用这样的写法,而是用mid = L + ((R-L) >> 1)
,这是为什么呢?
其实是在实际开发中 L + R可能会造成溢出,此时再进行乘除操作都会抛异常,而使用 L + (R - L)/ 2是一种更加稳妥的方法,R - L 永远不会造成溢出,所以更加保险。而 (R - L) / 2可以写成 (R - L) >> 1,意思是右移一位。举个例子,16右移一位是多少呢?16的二进制是10000,右移一位二进制是01000,十进制等于8,相信老鸟对此并不陌生,为啥非要用右移呢?因为位运算比算术运算要快得多,所以这并不是一种装X的写法。