-1

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

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

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

4

4 回答 4

2

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

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

于 2013-10-28T22:25:44.767 回答
2

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

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

同样,对于右移:如果x = 0b1010,则x >> 1变为0b1101,最右边的位消失,新的“一个”位(取决于最左边的位的值)被附加到左边。

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

于 2013-10-28T22:32:36.430 回答
1

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

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

然后我们要将“>>”右移 1,这会将所有位向右移动 1 个位置。在这种情况下,它会变成0000当您右移时复制符号位。如果是1111它会变成1111. 这就像除以二,除了在某些情况下,你必须厌倦符号位的复制。

于 2013-10-28T22:36:54.270 回答
1

如果您想了解位移运算符的工作原理,我建议您做两件事:

  • 首先,阅读一些关于他们做什么的指南:例如这里这里
  • 编写一些代码并查看输出。通过这种方式,您可以看到位移运算符如何实际影响 和 之类Integer.MIN_VALUE的值Integer.MAX_VALUE
于 2013-10-28T22:27:02.473 回答