1.If m == n, we just return m or n.

2.If the number of binary bits of m and n are not equal to each other, we return 0. Because if the numbers of binary bits are not equal, suppose m = 0000, 1011, n = 0001, 0000, you will find that once the number of the binary bits are not equal(in this case m contains 4 bits, leading zeros can be ignored, and n contains 5 bits), X = X & Xi, where m <= i <= n, the result of X will be zero.

3.If the number of binary bits of m and n are equal to each other, then the only thing we should concern about is those bits that m and n are different from to each other(in this case n - m = 5, 5 contains 3 bits), so the lower 3 bits of the result should be set to zeros, and the higher bits of the result should be set to m & n.

```
class Solution {
public:
int rangeBitwiseAnd(int m, int n)
{
if (m == n)
return m;
int mnumOfBinaryBits = binaryBits(m);
int nnumOfBinaryBits = binaryBits(n);
if (mnumOfBinaryBits != nnumOfBinaryBits)
return 0;
int diffnumOfBinaryBits = binaryBits(n - m);
return m & n & (0xffffffff << diffnumOfBinaryBits);
}
private:
int binaryBits(int n)
{
int cnt = 0;
if (n == 0)
return 1;
while (n > 0)
{
cnt++;
n /= 2;
}
return cnt;
}
};
```