有人请解释如何解决这样的任务?
int x = (Integer.MIN_VALUE << 1) >> 1;
我想了解如何解决这样的例子?如果样本包含 Integer.MIN_VALUE (Integer.MAX_VALUE) 我需要做什么?
移位运算符 ( y << x
) 只是将 的位y
向左移动“x”位。最右边的位变为0
。运算符向右移动,最>>
左边的位(符号位)的值被复制到新的最左边位。
要计算出您的答案,您需要初始值 (Integer.MIN_VALUE) 的位模式,然后执行操作以获得结果位模式。然后,您可以将其转换回十进制值。
好吧,您可以按照简短的教程http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
简而言之,通过执行<<
(左移),您将数字的二进制表示向左移动,
即如果x = 0b0010
,则x << 1
变为0b0100
,新的“零”位将附加到右侧。
同样,对于右移:如果x = 0b1010
,则x >> 1
变为0b1101
,最右边的位消失,新的“一个”位(取决于最左边的位的值)被附加到左边。
您需要找出 的二进制表示Integer.MIN_VALUE
来解决您的难题,这应该不是很棘手。
最小值表示为10000000000000000000000000000000
。是 32 个 1。为了清楚起见,让我们假设我们只使用 4 位。在这种情况下,MIN_INT
将是1000
。这也适用于 32 位。
然后我们想要左移<<
1,这会将所有位向左移动 1 个位置。这样,1000
就会变成0000
。这就像乘以 2(尽管在这种情况下我们会溢出!),
然后我们要将“>>”右移 1,这会将所有位向右移动 1 个位置。在这种情况下,它会变成0000
当您右移时复制符号位。如果是1111
它会变成1111
. 这就像除以二,除了在某些情况下,你必须厌倦符号位的复制。