有人请解释如何解决这样的任务?
int x = (Integer.MIN_VALUE << 1) >> 1;
我想了解如何解决这样的例子?如果示例包含Integer.MIN_VALUE(Integer.MAX_VALUE),我需要做什么?
答案 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)
如果你想了解位移操作符的工作原理,我会建议两件事:
答案 3 :(得分:1)
最小值表示为10000000000000000000000000000000
。这是32 1。为清楚起见,让我们假装我们只使用4位。在这种情况下,MIN_INT
将是1000
。这也适用于32位。
然后我们想要将<<
移位1,这会将所有位向左移动1个位置。因此,1000
将成为0000
。这就像乘以2(虽然在这种情况下我们会溢出!),
然后我们要右移'&gt;&gt;'乘以1,将所有位向右移位1个位置。在这种情况下,当您右移时,符号位将被复制,它将变为0000
。如果是1111
,它将变为1111
。这就像除以2,除了在某些情况下,因为你必须厌倦复制的符号位。