码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode Bitwise AND of Numbers Range

时间:2015-09-13 19:52:42      阅读:164      评论:0      收藏: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.

 

这题考的是位操作

需要探索的一个基本式子是 (n & (n - 1))

假设有这样一个数xxxxxxxxxxx10000(这里示意的是最右边一个为1的位,x表示可为1可为0)

那么n - 1 = xxxxxxxxxxx01111

n & (n - 1)呢?

我们发现恰好将最右边那个1消去了.

等等,似乎还有信息可以发掘n = xxxxxxxxxxx10000, n - 1 = xxxxxxxxxxx01111, n & (n -  1) = xxxxxxxxxxx00000

有没有发现 n 和 (n & (n - 1))之间差了可不只1啊, 那这之间的数是个什么形式呢??

 n     =        xxxxxxxxxxx10000

n - 1 =       xxxxxxxxxxx01111

         xxxxxxxxxxx01110

                ......

                xxxxxxxxxxx0xxxx

                ......

n & (n - 1) =       xxxxxxxxxxx00000

有没发现,所有这些数相与的结果就是n & (n - 1)

所以解法就很简洁了:

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

 

leetcode Bitwise AND of Numbers Range

标签:

原文地址:http://www.cnblogs.com/hustxujinkang/p/4805352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!