美文网首页
201. Bitwise AND of Numbers Rang

201. Bitwise AND of Numbers Rang

作者: Shiyi001 | 来源:发表于2016-10-15 13:01 被阅读0次

    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]之间的数全部进行&操作,求最后的值。我们不妨设m和n这两个数字前k位二进制数相同,即:

    m=a1a2...ak0ak+2...a32 n=a1a2...ak1ak+2...a32

    对于第k+2位二进制数到第32位,我们总可以找到一个[m,n]之间的数,使得该数位上的二进制数值为0

    所以我们要求的值为

    ans = a1a2...ak00...0(32-k个0)

    我们来看具体的求法:

    class Solution {
    public:
        int rangeBitwiseAnd(int m, int n) {
            while (n > m){
                n &= (n-1);
            }
            return n;
        }
    };
    

    n &= (n-1)这行代码的含义是将n的二进制数最低位的1变为0,所以整段代码是不断将n的二进制数最低位的1变为0直到n <= m,也就求出了我们要求的ans

    举个栗子

    初始

    7 = 1011, 5 = 1001,可知我们要求的ans = 1000

    循环过程

    7 -> 1011 -> 1010 -> 1000 <= 5 所以ans = 1000 = 4

    相关文章

      网友评论

          本文标题:201. Bitwise AND of Numbers Rang

          本文链接:https://www.haomeiwen.com/subject/nconyttx.html