代码之家  ›  专栏  ›  技术社区  ›  Nate

Java> > > > >操作符?[复制品]

  •  16
  • Nate  · 技术社区  · 15 年前

    这个问题已经有了答案:

    我没有我的Java参考书,我很难找到谷歌的答案。

    Java中的“& gt;& gt”和“& gt;& gt;& gt;”之间的区别是什么?

    int value = 0x0100;
    
    int result = (value >> 8);
    System.out.println("(value >> 8) = " + result);  // Prints: "(value >> 8) = 1"
    
    result = (value >>> 8);
    System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1"
    
    9 回复  |  直到 12 年前
        1
  •  17
  •   Yatharth Agarwal    12 年前
        2
  •  23
  •   lavinio    13 年前

    有符号整数使用高位来表示符号。

    所以 >> 保留标志,同时 >>> 没有,这就是为什么 >> 被称为 算术 移位和 >>> 符合逻辑的 换档。

    这样,您可以(假设为32位整数)执行以下操作:

    • -10 >> 1 收益率5 0xFFFFFFF6 >> 1 生成0xfffffbf-注意高位保持不变。)
    • -10 >>> 1 产量2147483643( 0xFFFFFFF6 >>> 1 生成0x7ffffffb-注意所有位都被移位了,所以高阶位现在为零。根据两个补码算术,数字不再是负数。)

    对于正整数, >> >>> 同样的操作,因为高位已经为零。

    这也解释了为什么不需要 <<< 操作员。由于符号将通过向左滑动位而被丢弃,因此它将映射到没有合理的算术运算。

        3
  •  8
  •   William Brendel    15 年前

    Java Notes: Bitwise Operators :

    n & gt;gt;p (右移) 移动n右p位置的位。如果n是2的补码有符号数,则符号位移到高位。

    例子: 5>>2=1

    不适用 (右移) 移动n右p位置的位。零移到高阶位置。

    例子: -4>>>28=15

        4
  •  4
  •   Michael Myers KitsuneYMG    15 年前

    正确的答案已经发布了不止一次,但不是来自权威来源。

    这是从 JLS §15.19 Shift Operators :

    这个 移位算子 包括左移位 << ,有符号右移 >> ,和无符号右移位 >>>

    价值 n>>s n 右移 s 带符号扩展的位位置。结果值为 n 2 S ②对于非负值 n ,这相当于截断整数除法,由整数除法运算符计算。 / 以二分之二的力量 S .

    价值 n>>>s n 右移 S 零延伸位位置。如果 n 为正,则结果与 n & gt;s 如果 n 为负,结果等于表达式的结果 (n>>s)+(2<<~s) 如果左侧操作数的类型为 int 以及表达式的结果 (n>>s)+(2L<<~s) 如果左侧操作数的类型为 long . 增补条款 (2<<~s) (2L<<~s) 取消传播的符号位。(注意,由于移位运算符右侧操作数的隐式掩蔽, ~s 因为移位距离等于 31-s 当移动 int 价值与对 63-s 换档时 长的 价值)

        5
  •  4
  •   dhackner    15 年前

    对于正数,没有区别。负数(两个补码)将用零填充>>,一个填充>。

    1010 0110>>>2=0010 1001

    1010 0110>>2=1110 1001

        6
  •  2
  •   James    15 年前

    >>是一个算术移位,它将符号位保留在任何“空”位中。另一种是逻辑移位,它用零填充空位。

        7
  •  0
  •   akf    15 年前

    一些 info

    >>运算符保留最左边的位。最左边的位用前面的内容填充。这是与符号扩展有关。在这种情况下,左侧有一个1,它被保留下来。如果不想将1保持在左侧,请使用将0转换为最左侧位的>>>运算符。

        8
  •  0
  •   BCS    15 年前

    它与有符号值数学有关。这个 >>> 对于高阶位元,零药片 >> 保留标志位并将其拉入。

        9
  •  0
  •   starblue    15 年前

    算术移位& gt;& gt;对于有符号整数除以二,而逻辑移位& gt;& gt;& gt;对于无符号数除以两个(如果你将符号Javaint中的位模式解释为无符号整数)。