1. 题目
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 按位查找0
- 先找到最小数的最高位high
- 遍历high到0位,每次从m开始向n查找该位,遇到0的,答案的该位也为0,转到下一位
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int i, high = 30, ans = m;
long num;
while(high>=0 && ((m>>high)&1)!=1)
high--;//找到最小的数的最高位
for(i = high; i >= 0; --i)
{
for(num = m; num <= n; ++num)
{ //2147483646、2147483647,int++溢出
if(((num>>i)&1)==0)
{
ans &= ~(1<<i);
break;
}
}
}
return ans;
}
};
324 ms 5.9 MB
2.2 两数直接都往右移动,直到相等
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int move = 0;
while(m != n)
{
m >>= 1;
n >>= 1;
move++;
}
return m << move;
}
};
8 ms 6 MB