Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4.
Understand the problem:We could take several examples, e.g. 5 6 7
101
110
111
-------
100
We could find out that the trick of the problem is when compare bit-by-bit for each number, once they are the same, e.g. bit 1 for the most significant bit, they start to be the same.
9 10 11 12
1001
1010
1011
1100
---------
1000
So the solution is shift both m and n to the right until they are the equal, count the number of steps it shifted. Then shift m left to the number of steps.
Code (Java):
public class Solution { public int rangeBitwiseAnd(int m, int n) { int shift = 0; while (m != n) { shift++; m = m >> 1; n = n >> 1; } return m << shift; } }
No comments:
Post a Comment