当前位置: 面试刷题>> 数字范围按位与(经典算法150题)


### 题目描述补充 题目:**数字范围按位与** 给定一个范围 [left, right] 表示一个闭区间内的所有整数,其中 0 ≤ left ≤ right ≤ 2^31 - 1,计算并返回该范围内所有数字的按位与(bitwise AND)结果。 **示例 1**: ``` 输入: [5,7] 输出: 4 解释: 5: 101 6: 110 7: 111 按位与结果: 100,即 4 ``` **示例 2**: ``` 输入: [0] 输出: 0 ``` **示例 3**: ``` 输入: [1,2147483647] 输出: 0 解释: 最大的数是 2147483647,其二进制表示是 31 个 1。与任何数进行按位与操作,结果都将是 0。 ``` ### 解题思路 这个问题可以通过观察数字的二进制表示来解决。一般来说,如果 `left` 和 `right` 相差很远,那么大部分位上的数字都会不同,按位与的结果很可能是 0。但如果 `left` 和 `right` 在某个前缀之后才开始不同,那么前缀部分的按位与结果就是这个问题的解。 一个高效的算法是找到 `left` 和 `right` 最高位开始不同的位置,这个位置之前的所有位都是相同的,并且这些位就是我们要找的答案。 ### PHP 代码示例 ```php function rangeBitwiseAnd($left, $right) { $shift = 0; // 找到 left 和 right 最高位开始不同的位置 while ($left < $right) { $left >>= 1; $right >>= 1; $shift++; } // 将 left 左移回原来的位置,因为我们已经右移了 shift 位 return $left << $shift; } // 示例测试 echo rangeBitwiseAnd(5, 7); // 输出 4 echo "\n"; echo rangeBitwiseAnd(0, 0); // 输出 0 echo "\n"; echo rangeBitwiseAnd(1, 2147483647); // 输出 0 ``` ### Python 代码示例 ```python def rangeBitwiseAnd(left, right): shift = 0 # 找到 left 和 right 最高位开始不同的位置 while left < right: left >>= 1 right >>= 1 shift += 1 # 左移回原来的位置 return left << shift # 示例测试 print(rangeBitwiseAnd(5, 7)) # 输出 4 print(rangeBitwiseAnd(0, 0)) # 输出 0 print(rangeBitwiseAnd(1, 2147483647)) # 输出 0 ``` ### JavaScript 代码示例 ```javascript function rangeBitwiseAnd(left, right) { let shift = 0; // 找到 left 和 right 最高位开始不同的位置 while (left < right) { left >>>= 1; right >>>= 1; shift++; } // 左移回原来的位置 return left << shift; } // 示例测试 console.log(rangeBitwiseAnd(5, 7)); // 输出 4 console.log(rangeBitwiseAnd(0, 0)); // 输出 0 console.log(rangeBitwiseAnd(1, 2147483647)); // 输出 0 ``` 在这些示例中,我们利用了位运算的右移(`>>=` 或 `>>>=`)和左移(`<<`)来高效地找到并计算答案。这种方法避免了遍历整个范围,从而提高了算法的效率。
推荐面试题