Java的>>对比>>>运营商?

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

Java中的“>>”和“>>>”运算符有什么区别?

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" 

>>>是逻辑移位 , >>是算术移位 。

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

所以>>保留标志,而>>>不保留。 这就是为什么>>被称为算术移位而>>>逻辑移位。

这样,你可以做(​​假设32位整数)以下内容:

  • -10 >> 1产生-5( 0xFFFFFFF6 >> 1产生0xFFFFFFFB – 注意高阶位保持不变。)
  • -10 >>> 1产生2147483643( 0xFFFFFFF6 >>> 1产生0x7FFFFFFB – 注意所有位都被移位,因此高位为零。根据二进制补码,数字不再为负数。)

对于正整数, >>>>>行为相同,因为高位已经为零。

它还解释了为什么不需要<<<运算符。 由于符号会通过将位滑动到左侧而被破坏,因此它将映射到没有合理的算术运算。

来自Java Notes:按位运算符

n >> p (右移)移位 n个右p位的位。 如果n是2的补码有符号数,则符号位移入高位。

示例: 5 >> 2 = 1

n >>> p (右移)移位 n个右p位的位。 零被转移到高阶位置。

示例: -4 >>> 28 = 15

正确答案已多次发布,但不是来自权威来源。

这来自JLS§15.19class次操作员 :

移位运算符包括左移<< ,右移右移>>和无符号右移>>> ; 它们在语法上是左联想的(它们从左到右分组)。 移位运算符的左侧操作数是要移位的值; 右侧操作数指定移位距离。

...

n>>s的值是带有符号扩展的右移位s位。 结果值为⌊n / 2 s⌋。 对于n非负值,这相当于将由整数除法运算符f计算的整数除法截断为幂2。

n>>>s的值是n右移位s位,零扩展。 如果n为正,则结果与n>>s的结果相同; 如果n为负,则结果等于表达式(n>>s)+(2<<~s)如果左侧操作数的类型为int ,则结果为表达式的结果(n>>s)+(2L<<~s)如果左操作数的类型很long 。 添加的项(2<<~s)(2L<<~s)抵消了传播的符号位。 (注意,由于移位运算符的右侧操作数的隐式屏蔽,当移位int值时,移位距离等于31-s ,移位long值时相当于63-s 。)

对于正数,没有区别。 负数(二进制补码)数字将用>>填充零,用>>填充一些。

1010 0110 >>> 2 = 0010 1001

1010 0110 >> 2 = 1110 1001

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

一些信息

>>运算符保留最左边的位。 最左边的位用前面的内容填充。 这与标志扩展有关。 在这种情况下,左边有一个1并保留。 如果您不想将1保持在左侧,请使用>>>运算符将0移到最左边的位

它与有符号值数学有关。 对于高阶位, >>>以零填充的药片, >>保留符号位并将其拉入。

对于有符号整数,算术移位>>除以2,而对于无符号数,逻辑移位>>>除以2(如果将有符号Java int中的位模式解释为无符号整数)。