Java 中无符号右移位运算符“>>>”的用途是什么?

我理解Java中无符号右移位运算符“>>>”的作用,但是为什么我们需要它,为什么我们不需要相应的无符号左移运算符?


答案 1

该运算符允许您将 和 视为 Java 语言中缺少的 32 位和 64 位无符号整数类型。>>>intlong

当您移动不表示数值的内容时,这很有用。例如,您可以使用 32 位 s 表示黑白位图图像,其中每个图像在屏幕上编码 32 个像素。如果您需要将图像向右滚动,则希望 将 左侧的位变为零,以便您可以轻松地将相邻 s 中的位放入:intintintint

 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;
 }

上面的代码没有注意上面三位的内容,因为操作员使它们>>>

没有相应的运算符,因为对有符号和无符号数据类型的左移操作是相同的。<<


答案 2

>>>也是查找两个(大)整数的舍入平均值的安全有效方法:

int mid = (low + high) >>> 1;

如果整数并且接近最大的机器整数,则上述情况将是正确的,但是highlow

int mid = (low + high) / 2;

由于溢出,可能会得到错误的结果。

下面是一个示例用法,修复了幼稚的二进制搜索中的错误。