给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
leetcode
解题思路:找规律的问题,在实战中,很难快速进行证明。
- 其实可以发现,只有前缀的1才有可能保存下来,应为是连续的,后面是肯定会产生很多0的,所需,寻找最长的前缀1就是最后的位与答案。
class Solution {
public int rangeBitwiseAnd(int m, int n) {
int move = 0;
// 找到公共前缀
while (m < n) {
m >>= 1;
n >>= 1;
move ++;
}
return m << move;
}
}