zoukankan      html  css  js  c++  java
  • 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.

    这题考的是位操作

    需要探索的一个基本式子是 (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;
        }
    
  • 相关阅读:
    性能优化方法(Z)
    .NetChajian
    ServiceStack.Redis订阅发布服务的调用(Z)
    C#操作XML总结
    WPF DataGrid 性能加载大数据
    Mongodb 基础(Z)
    WPF 主题切换(Z)
    .Net全景视图
    C#动态创建和动态使用程序集、类、方法、字段等
    P3370 【模板】字符串哈希
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4805352.html
Copyright © 2011-2022 走看看