1

我在互联网上发现了这个 java 问题,并对此有一些疑问。

哪些陈述是准确的:

  • a) >> 执行有符号移位,而 >>> 执行无符号移位。
  • b) >>> 执行有符号移位,而 >> 执行无符号移位。
  • c) << 执行有符号移位,而 <<< 执行无符号移位。
  • d) <<< 执行有符号移位,而 << 执行无符号移位。

我有点不确定带符号的移位是什么,这是否意味着它保留二进制数的符号而不管移位本身发生了什么(这对我来说最有意义)还是意味着 MSB 确实除非在移位操作本身中被覆盖,否则不会更改。

所以

  • a) 正确:无论您使用 >> 进行多少次轮班,MSB 始终保留为其原始因此已签名?而 >>> 将始终用 0 覆盖 MSB,因此无符号?
  • b) 错误,因为上面的解释
  • c) 不确定,因为第一位可以用 << 移位操作覆盖,因此不保留其符号?
  • d) 再次不确定。
4

5 回答 5

2

另一种描述: http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

来自文章:“无符号右移运算符>>>”将零移到最左边的位置,而“>>”之后的最左边的位置取决于符号扩展。

于 2012-08-14T14:01:37.647 回答
1

">>" 执行有符号移位,用最左边的位填充新位。最左边的位确定数字是负数还是正数。0 表示正,1 表示负。例如,

>> 1
10111100 becomes 11011110
the leftmost bit is a 1, so the new bits after the shift become ones

>> 1
01110011 becomes 00111001 since the leftmost bit is a 0

>>>>" 执行无符号移位,这意味着新位在移位后总是用零填充。例如,

>>> 1
10111100 becomes 01011110
the new bits are filled in as zeroes no matter what the leftmost bit is


enter code here
于 2012-08-14T14:06:19.657 回答
0

查看 Java 语言规范: http ://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.19

于 2012-08-14T14:00:14.283 回答
0

这是否意味着它保留二进制数的符号,无论移位本身发生什么(这对我来说最有意义)还是意味着 MSB 不会改变,除非它在移位操作本身中被覆盖。

那是一样的。;)

而 >>> 将始终用 0 覆盖 MSB,因此无符号

如果你这样做-1 >>> 0,它仍然是负面的,但它基本上是正确的;)

左移没有符号或无符号,只是左移,正如你所说,它可能会也可能不会改变符号。

于 2012-08-14T14:01:08.870 回答
0
<<  Signed left shift      op1 << op2 
>>  Signed right sift      op1 >> op2 
>>> Unsigned right shift   op1 >>> op2 
于 2012-08-14T14:01:16.750 回答