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

Nat*_*ate 17 java bit-manipulation operators

我没有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"
Run Code Online (Sandbox Code Playgroud)

lav*_*nio 24

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

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

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

  • -10 >> 1产量-5(0xFFFFFFF6 >> 1产生0xFFFFFFFB - 注意高阶位保持不变.)
  • -10 >>> 1产生2147483643(0xFFFFFFF6 >>> 1产生0x7FFFFFFB - 注意所有位都被移位,所以高位比特现在为零.根据二进制补码,这个数字不再是负数.)

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

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

  • +1最有用的答案 (5认同)

Wil*_*del 9

来自Java Notes:按位运算符:

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

示例: 5 >> 2 = 1

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

示例: -4 >>> 28 = 15


Mic*_*ers 5

正确答案已发布多次,但并非来自权威机构。

这是从JLS §15.19移位操作

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

...

的值n>>s是带符号扩展名的n右移位s。所得到的值是⌊ ñ / 2 小号 ⌋。对于的非负值n,这等效于将整数除法运算符/(由整数除法运算符计算)除以2等于幂s

的值n>>>s是零扩展的n右移位s位置。如果n为正,则结果与n>>s; 相同。如果n是负的,其结果是等于表达的(n>>s)+(2<<~s),如果左手的类型操作数是int,向表达式的结果(n>>s)+(2L<<~s),如果左手的类型操作数是long。相加的项(2<<~s)(2L<<~s)抵消传播的符号位。(需要注意的是,因为移位运算符的右操作数的隐式掩蔽,的~s作为移位距离等于31-s偏移的时int值,并63-s移位时long的值)。


dha*_*ner 5

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

1010 0110 >>> 2 = 0010 1001

1010 0110 >> 2 = 1110 1001