来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range
著作权归领扣网络所有。
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
方法1:找到公共前缀
int rangeBitwiseAnd(int m, int n) {
int shift = 0;
// 找到公共前缀
while (m < n) {
m >>= 1;
n >>= 1;
++shift;
}
return m << shift;
}
方法2:Brian Kernighan 算法
int rangeBitwiseAnd(int m, int n) {
while (m < n) {
// 抹去最右边的 1
n &= (n - 1);
}
return n;
}
方法2:暴力方法
int rangeBitwiseAnd(int m, int n) {
for (int i = m+1; i <= n; i++) {
m &= i;
}
return m;
}