给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
解法:按位与,都为1才是1,否则为0,一段连续的区间,找到端点的公共前缀,后面的部分因为连续,每一列都肯定有0,所以后面全是0,我们先将数向左移,移到两个数相等,再像右移补零
class Solution {
public int rangeBitwiseAnd(int m, int n) {
int cnt = 0;
// 找到公共前缀
while (m < n) {
m >>= 1;
n >>= 1;
++cnt;
}
return m << cnt;
}
}