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.
解答:
仔细观察规律,发现从m到n的所有数中,保留下来的是m和n从左到右开始考虑的相等的数。可以这样考虑,对于m,n,我们从左往右看,发现了第一个不一样的数,然后考虑,其实m和n之间那些数是不可能导致第一个不一样的数左边的区别的,只会在右边影响。
所以总体来说,m和n分别往右移动,直到第i步发现他们终于相等了,然后返回m向左移动i步的值。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int i=0;
while(m!=n)
{
m>>=1;
n>>=1;
++i;
}
return m<<i;
}
};