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.