文章目录
- 1. 题目
- 2. 解题
- 2.1 按位查找0
- 2.2 两数直接都往右移动,直到相等
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