Java 中无符号右移位运算符“>>>”的用途是什么?
2022-09-01 11:47:09
我理解Java中无符号右移位运算符“>>>”的作用,但是为什么我们需要它,为什么我们不需要相应的无符号左移运算符?
我理解Java中无符号右移位运算符“>>>”的作用,但是为什么我们需要它,为什么我们不需要相应的无符号左移运算符?
该运算符允许您将 和 视为 Java 语言中缺少的 32 位和 64 位无符号整数类型。>>>
int
long
当您移动不表示数值的内容时,这很有用。例如,您可以使用 32 位 s 表示黑白位图图像,其中每个图像在屏幕上编码 32 个像素。如果您需要将图像向右滚动,则希望 将 左侧的位变为零,以便您可以轻松地将相邻 s 中的位放入:int
int
int
int
int shiftBy = 3;
int[] imageRow = ...
int shiftCarry = 0;
// The last shiftBy bits are set to 1, the remaining ones are zero
int mask = (1 << shiftBy)-1;
for (int i = 0 ; i != imageRow.length ; i++) {
// Cut out the shiftBits bits on the right
int nextCarry = imageRow & mask;
// Do the shift, and move in the carry into the freed upper bits
imageRow[i] = (imageRow[i] >>> shiftBy) | (carry << (32-shiftBy));
// Prepare the carry for the next iteration of the loop
carry = nextCarry;
}
上面的代码没有注意上面三位的内容,因为操作员使它们>>>
没有相应的运算符,因为对有符号和无符号数据类型的左移操作是相同的。<<
>>>
也是查找两个(大)整数的舍入平均值的安全有效方法:
int mid = (low + high) >>> 1;
如果整数并且接近最大的机器整数,则上述情况将是正确的,但是high
low
int mid = (low + high) / 2;
由于溢出,可能会得到错误的结果。
下面是一个示例用法,修复了幼稚的二进制搜索中的错误。