leetcode--201. 数字范围按位与

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

示例 1:

输入: [5,7]
输出: 4

示例 2:

输入: [0,1]
输出: 0

参考的别人思路:

考虑范围[m,n],如果n比m二进制位数高的话,在累计按位与的过程中,数字的每一个二进制位数必然都出现过0,所以一旦出现位数不同的情况,结果必然为0。why?举个例子,[5-9],5:101,8:1001,则在从5递增的过程中,增加到8,此时进位导致5和8的二进制位不同,所以可以知道必然为0,因为进位会让低三位全为0,而与0必然为0。

程序中,m,n在向右移位的过程中,如果m,n相等了,就说明按位与的左边肯定等于m,n此时的状态,这时候就可以向左移回来了,相当于右边所有位数都补0,相等的部分照旧。

如果m,n位数不相等,肯定会移到底,这时候再向左移多少结果都是0

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

 

你可能感兴趣的:(leetcode)