【发布时间】:2015-11-09 19:04:41
【问题描述】:
我正在研究 Java 1.8 Api。
在java.util.Arrays.binarySearch(int[] a, int key),我找到了这段代码。
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
在这段代码中(low + high) >>> 1 不会溢出。
谁能告诉我为什么会这样?我用自己的代码测试它。
int low = Integer.MAX_VALUE;
int high = Integer.MAX_VALUE;
System.out.println((low + high) / 2);
System.out.println((low + high) >>> 1);
那么,这是否意味着逻辑右移会考虑溢出位?
【问题讨论】:
-
>>>将值视为 32 位无符号整数,两个 31 位有符号整数之和不能大于 32 位无符号整数,因此不会出现溢出这个操作的。注意:如果您使用>>,您可能会遇到问题。