当前位置: 首页 > 知识库问答 >
问题:

">>>" 在java中是什么意思?

倪培
2023-03-14

我发现这段代码是为了在SO post中找到重复的代码。但我不明白这行是什么意思

private static int findDuplicate(int[] array) {
        int low = 0;
        int high = array.length - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            System.out.println(mid);
            int midVal = array[mid];

            if (midVal == mid)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return high;
    }

共有3个答案

连曜灿
2023-03-14

它是一个按位运算符。。它对位值有效。假设A保持60,那么A

其实际名称为“移位零右运算符”,此处,左操作数的值按右操作数指定的位数(本例中为2)向右移动,移位后的值用零(0000)填充。

卫博雅
2023-03-14

的意义

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

是通过使用无符号移位,它避免了导致负数的溢出。这是必需的,因为Java不支持无符号int值。(顺便说一句,字符未签名)

传统的写作方式是

int mid = (low + high) / 2; // don't do this

然而,对于较大的和,这可能会溢出,而mid会得到一个负数。

例如

int high = 2100000000;
int low = 2000000000;
System.out.println("mid using >>> 1 = " + ((low + high) >>> 1));
System.out.println("mid using / 2   = " + ((low + high) / 2));

印刷品

mid using >>> 1 = 2050000000
mid using / 2   = -97483648

显然,第二个结果是不正确的。

呼延源
2023-03-14

<代码>

<代码>

更新:

让我们平均1和2147483647(Integer.MAX\u值)。我们可以轻松地计算:

(1 + 2147483647) / 2 = 2147483648 / 2 = 1073741824

现在,对于代码(低-高)/2,这些是涉及的位:

          1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000  // Overflow
/2
================================================
-1073741824: 11000000 00000000 00000000 00000000  // Signed divide, same as >> 1.

让我们“转移”到<代码>

          1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000  // Overflow
>>> 1
================================================
+1073741824: 01000000 00000000 00000000 00000000  // Unsigned shift right.

 类似资料:
  • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如

  • 问题内容: 我正在学习上面的代码,它告诉我什么是自省者和什么是stopClass。但是我不明白这是什么意思?`for (PropertyDescriptor prop props) for(i=0;i<100;i++)` 有人可以帮忙进一步解释吗?谢谢! 问题答案: 这就是 Java 5中引入的每种循环语法。

  • 问题内容: 我的问题如上所述。抱歉,可能是重复的,但最后找不到一个示例。 为什么不只使用它作为参数? 问题答案: 是可参数化的类,因此可以使用where 类型的语法。通过编写,您可以声明一个可以是任何类型的对象(是通配符)。该类型是包含类元信息的类型。 通过指定特定类型来引用泛型类型始终是一种好习惯,这是通过尊重您的习惯(您知道可参数化的)来使用的,但并不限制参数具有特定类型。 有关泛型和通配符的

  • 问题内容: 我有一个程序试图缩小到所需的数量。我得到的输出是。 在Java 中是什么意思? 问题答案: “ NaN”代表“不是数字”。如果浮点运算具有一些输入参数,导致该运算产生一些未定义的结果,则会生成“ Nan”。例如,0.0除以0.0在算术上是不确定的。负数的平方根也是不确定的。

  • 在Java中是什么意思?例如,如果我创建了一个名为的类。返回什么?