给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
题解:这道题需要我们找出范围内的数字的二进制形式的公共前缀,找出的公共前缀所代表的十进制数字就是最后的结果。在找公共前缀时,我们主要的焦点应该放在边界数字m、n上,只要找到了m、n的公共前缀,就是所有数字的公共前缀。所以这道题我们只需要找m、n的公共前缀就可以。
法一:位移,将m、n进行位移计算,知道m与n相等为止。
class Solution {
public int rangeBitwiseAnd(int m, int n) {
int move = 0;
while (m != n) {
m >>= 1;
n >>= 1;
move++;
}
return m << move;
}
}
法二:BK算法,利用BK算法依次去掉n的二进制最右边的数字1,直到n小于m为止
class Solution {
public int rangeBitwiseAnd(int m, int n) {
while(m<n)
n&=(n-1);
return n;
}
}