Java的>>与>>>操作?

时间:2009-06-23 19:28:54

标签: java operators bit-manipulation

我没有我的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"

9 个答案:

答案 0 :(得分:24)

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

因此>>会保留该符号,而>>>则不会。这就是为什么>>被称为算术移位而>>>逻辑移位的原因。

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

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

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

它还解释了为什么不需要<<<运算符。由于符号会通过向左滑动来进行删除,因此它将映射到没有合理的算术运算。

答案 1 :(得分:16)

答案 2 :(得分:9)

来自Java Notes: Bitwise Operators

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

示例: 5&gt;&gt; 2 = 1

n&gt;&gt;&gt; p (右移) 移动n个右p位的位。零被转移到高阶位置。

示例: -4&gt;&gt;&gt; 28 = 15

答案 3 :(得分:5)

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

1010 0110&gt;&gt;&gt; 2 = 0010 1001

1010 0110&gt;&gt; 2 = 1110 1001

答案 4 :(得分:4)

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

这来自JLS §15.19 Shift Operators

  

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

     

...

     

n>>s的值是带有符号扩展名的n右移s位位置。结果值为⌊ n / 2 s ⌋。对于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-slong 1}}在移动{{1}}值时。)

答案 5 :(得分:2)

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

答案 6 :(得分:0)

一些info

  

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

答案 7 :(得分:0)

它与有符号值数学有关。对于高位位,>>>以零为单位,>>保留符号位并将其拉入。

答案 8 :(得分:0)

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