在这篇博客文章中,作者提出了以下错误修复建议:
int mid = (low + high) >>> 1;
Run Code Online (Sandbox Code Playgroud)
有谁知道这个>>>运营商是什么?当然它不在以下运营商参考清单上:
它是什么以及如何解决溢出问题?
>>>是Java中的逻辑右移运算符。
它在左侧移入零,而不是保留符号位。博文的作者甚至提供了一个C++实现:
mid = ((unsigned int)low + (unsigned int)high)) >> 1;
Run Code Online (Sandbox Code Playgroud)
...如果右移无符号数,保留符号位没有任何意义(因为没有符号位),因此编译器显然使用逻辑移位而不是算术移位。
上面的代码利用了 MSB(假设 32 位整数的第 32 位):将low和相加,high 它们都是非负整数,因此适合 31 位,不会溢出完整的 32 位,但它会扩展到 MSB。通过右移,32 位数字被有效地除以 2,并且第 32 位再次被清除,因此结果为正。
事实上,>>>Java 中的运算符只是该语言不提供unsigned数据类型这一事实的一种解决方法。
| 归档时间: |
|
| 查看次数: |
6669 次 |
| 最近记录: |