201. 数字范围按位与
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
解题思路: 考察位运算。给定一个范围,找这个范围所有数按位与的结果。本质上我们可以转化为这个范围内所有数的共同前缀,那么就可以转换成程序中的写法,这里解释一下为什么要在与上一个INT_MAX,因为在左移的过程中,正整数的高位0(符号位)被溢出,然后数字位的1补上后,d变成负数了,程序报错,所以我们要要高位符号位一直保持为0.
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int d = INT_MAX;
while ((m & d) != (n & d)) {
d = ((d << 1) & INT_MAX);
}
return m & d;
}
};