Shift运算符整数

时间:2013-10-28 22:15:20

标签: java bit-shift

有人请解释如何解决这样的任务?

int x = (Integer.MIN_VALUE << 1) >> 1;

我想了解如何解决这样的例子?如果示例包含Integer.MIN_VALUE(Integer.MAX_VALUE),我需要做什么?

4 个答案:

答案 0 :(得分:2)

移位运算符(y << x)只是将y的位向左移动'x'个位置。最右边的位变为0>>运算符向右移动,最左位(符号位)的值被复制到新的最左位。

要计算出你的答案,你需要初始值的位模式(Integer.MIN_VALUE),然后执行操作以获得结果位模式。然后,您可以将其转换回十进制值。

答案 1 :(得分:2)

好吧,你可以按照简短的教程http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

简而言之,通过执行<<(左移),您可以将数字的二进制表示移到左侧 即如果x = 0b0010,则x << 1变为0b0100,则右侧会附加新的“零”位。

类似地,对于右移: 如果x = 0b1010,则x >> 1变为0b1101,最右边的位消失,新的'一'位(取决于最左位的值)附加在左侧。

你需要找出Integer.MIN_VALUE的二进制表示来解决你的谜题,这应该不是很棘手。

答案 2 :(得分:1)

如果你想了解位移操作符的工作原理,我会建议两件事:

  • 首先,阅读一些有关他们所做工作的指南:例如herehere
  • 编写一些代码并查看输出。这样,您就可以看到位移操作符实际上如何影响Integer.MIN_VALUEInteger.MAX_VALUE等值。

答案 3 :(得分:1)

最小值表示为10000000000000000000000000000000。这是32 1。为清楚起见,让我们假装我们只使用4位。在这种情况下,MIN_INT将是1000。这也适用于32位。

然后我们想要将<<移位1,这会将所有位向左移动1个位置。因此,1000将成为0000。这就像乘以2(虽然在这种情况下我们会溢出!),

然后我们要右移'&gt;&gt;'乘以1,将所有位向右移位1个位置。在这种情况下,当您右移时,符号位将被复制,它将变为0000。如果是1111,它将变为1111。这就像除以2,除了在某些情况下,因为你必须厌倦复制的符号位。