【问题标题】:what's the usage about '>>>' operator in java? [duplicate]java中'>>>'运算符的用法是什么? [复制]
【发布时间】:2023-03-11 20:20:01
【问题描述】:

可能重复:
Java's >> versus >>> Operator?

嗨,

我知道>><< 可以提高性能,但是>>> 运算符的目的是什么?

JDK 源文件中的前 PriorityQueue 类,

 private void heapify() {
    for (int i = (size >>> 1) - 1; i >= 0; i--)
        siftDown(i, (E) queue[i]);
}

不要告诉我>>> 是如何工作的,只是我为什么使用它。

谢谢

【问题讨论】:

  • 使用位移运算符来提高速度是一种过时的观念,在现代编码中弊大于利。不要使用它,因为(size / 2) 更容易阅读并且性能也一样好。
  • “不要告诉我 '>>>' 是如何工作的,我为什么要使用它” ...如果你已经知道它是如何工作的,那么你应该现在为什么要使用它...

标签: java bit-manipulation


【解决方案1】:

>> 运算符保留最左边的位,但 >>> 不保留。

这意味着如果你用>> 移动一个负数,它会保持负数,但如果你用>>> 它不会。

所以使用>> 进行数学运算,使用>>> 进行位基运算。

【讨论】:

    【解决方案2】:

    使用<<>>>>> 对表示位模式的整数类型进行操作。

    不要使用它们来“加速”乘法和除法。很有可能它不会产生任何影响,而且实际上可能会使您的代码变慢。

    Java JIT 编译器应该能够为简单的算术表达式生成机器代码,对于它当前运行的硬件来说是最佳的。

    如果您使用巧妙的掩码和移位来实现您的算法,则有可能 1) 代码对于您正在运行的机器来说不是最优的,2) JIT 优化器不会发现您实际上是做算术......因此无法优化。最终结果将是更慢的代码。

    【讨论】:

    • +1 提到使用移位运算符来提高性能并不是一个好主意。
    【解决方案3】:

    >> 和 >>> 运算符之间的区别在于 >> 用于无符号移位。这意味着当>>保留该位的值时>>>清除最左边的位(因为实际上该位表示负值) 例子: 那么你有值 FFFFFFFEh = -2(有符号):

    -2 >> 1 = FFFFFFFF = -1 // >> 保留最高位值;注意,如果我们将 FFFFFFFF 视为无符号值,这是错误的

    -2 >>> 1 = 7FFFFFFF // >>> 清除最高位

    因此,如果您想使用无符号值进行操作,您应该使用 >>> 而不是 >>。

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 2012-06-15
      • 2011-12-19
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2020-05-22
      • 2014-12-10
      相关资源
      最近更新 更多