给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
示例 1:
输入:left = 5, right = 7
输出:4
示例 2:
输入:left = 0, right = 0
输出:0
示例 3:
输入:left = 1, right = 2147483647
输出:0
这是普通的按位与计算方式
class Solution {
public int rangeBitwiseAnd(int left, int right) {
while(right>left){
right&=(right-1);
}
return right;
}
}
实际上可以转化为二进制字符串求公共前缀的问题,右移直到m,n相同,边移边记录移动的次数。
class Solution {
public int rangeBitwiseAnd(int m, int n) {
if (m == 0) return 0;
int i = 0;
while (m != n) {
m >>= 1;
n >>= 1;
i++;
}
return m << i;
}
}