Why do the following two operations yield different results in Java for x = 31
or 32
but the same results for x=3
?
int
There are multiple issues at play:
int
can only store values between -2147483648
and 2147483647
.1 << x
only uses the lowest five bits of x. Thus, 1 << 32
is by definition the same as 1 << 0
.1 << 31
is negative.Math.pow(2, 32)
returns a double
.(int)(d)
, where d
is a double
greater than 2147483647
returns 2147483647
("the largest representable value of type int").What this interview question does is show that (int)Math.pow(2, x)
and 1 << x
are not equivalent for values of x
outside the 0
...30
range.
P.S. It is perhaps interesting to note that using long
in place of int
(and 1L
in place of 1
) would give yet another set of results different from the other two. This holds even if the final results are converted to int
.