leetcode笔记:Bitwise AND of Numbers Range

一. 题目描述

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

二. 题目分析

给定一个范围[m, n],其中 0 <= m <= n <= 2147483647,返回范围内所有整数的按位与,包括边界mn。比如给定范围为[5, 7], 应返回4

单看题目描述,可以知道该题涉及到位运算,因此需动笔分析:

对于题目给定的范围[5, 7],可写为:

5: 101
6: 110 -> 100 -> 4
7: 111

再来两个例子:

范围[6, 8]:

6: 0110
7: 0111 -> 0000 -> 0
8: 1000

范围[8, 10]:

8:  1000
9:  1001 -> 1000 -> 4
10: 1010

现在可以总结出规律了,对于范围[m, n],若n的最高有效位比m的最高有效位要高,则必然会出现像例子出现的情况,必然在范围内存在两个数,这两个数分别是对方的反码:

6: 0110
7: 0111 -> 0000 -> 0
8: 1000

因此,只有当mn的最高有效位一致时,即m与n同时右移n位,且m == n,m == 1时按位与结果不为0,且该结果为mn的公共左边首部,以下给出简单的代码:

三. 示例代码

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int bits = 0;
        while (m != n)
        {
            m >>= 1;
            n >>= 1;
            ++bits;
        }
        return m << bits;
    }
};

四. 小结

该题是数学问题,用位运算即可快速解决,主要是要找出规律。

你可能感兴趣的:(LeetCode,位运算,C++,bit,Bitwise)