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中的位模式解释为无符号整数)。