解法1:最大数清最小位,求二进制最大前缀
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while (m < n)
n = n&(n-1);
return m&n;
}
};
解法2:最大最小数移位至相等,留相同二进制前缀,再移位回去
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int shift = 0;
while (m != n) {
m >>= 1;
n >>= 1;
shift++;
}
return m<<shift;
}
};
有同学说没法证明最大最小数的二进制最大前缀是此范围内所有数字的按位与(包含 m, n 两端点),那请仔细想一想,因为是顺序的范围,若最小数的最低位是1,那么比它大的数最低位一定是0,相反若最小数的最低位是0,那么比它大的数最低位一定是1,同理,直至最大前缀的位,其他位都被与掉了。