题目:
给你两个整数 left
和 right
,表示区间 [left, right]
,返回此区间内所有数字 按位与 的结果(包含 left
、right
端点)。
示例 1:
输入:left = 5, right = 7
输出:4
示例 2:
输入:left = 0, right = 0
输出:0
示例 3:
输入:left = 1, right = 2147483647
输出:0
代码:
public class RangeBitwiseAnd {
public static int rangeBitwiseAnd(int m, int n) {
int shift = 0;
// 找到 m 和 n 的公共前缀
while (m < n) {
m >>= 1;
n >>= 1;
shift++;
}
// 将公共前缀左移 shift 位
return m << shift;
}
public static void main(String[] args) {
int m = 5;
int n = 7;
int result = rangeBitwiseAnd(m, n);
System.out.println("数字范围 [" + m + ", " + n + "] 按位与的结果是 " + result);
}
}
题解:
这段代码的实现思路是先找到 m 和 n 的公共前缀,然后将公共前缀左移 shift 位,最后返回结果。具体步骤如下:
1. 初始化 shift 为 0。
2. 循环执行以下操作,直到 m 大于等于 n:
- 将 m 和 n 同时右移一位。
- 将 shift 加 1。
3. 将 m 左移 shift 位,并返回结果。
在示例中,输入的范围是 [5, 7],经过循环后 m 和 n 变为 [0, 1],shift 为 3。因此,最后的结果是将 m 左移 3 位,即 0b00001000,即 8。