有人请解释如何解决这样的任务?
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. 这就像除以二,除了在某些情况下,你必须厌倦符号位的复制。