• 201. Bitwise AND of Numbers Range


    一、题目

      1、审题

      

      2、分析

        求 n~m 范围内的所有数字进行二进制 & 运算后的结果。

    二、解答

      1、思路:

        方法一、

        以 26~30 为例,二级制 & 运算,若出现了一个 0 则结果为 0。在这个例子中,结果为 11000,因此我们要减去后边部分不同的部分。这里后边有 3 个不同。

        

        public int rangeBitwiseAnd2(int m, int n) {
            int i = 0; // i means we have how many bits are 0 on the right
            while(m != n){
                m >>= 1;
                n >>= 1;
                i++;  
              }  
          return m << i;      
        }

      方法二、

        直接统计 m、n 共同前缀。后边部分置为 0。

    public int rangeBitwiseAnd(int m, int n) {
            return (n > m) ? (rangeBitwiseAnd(m >> 1, n >> 1) << 1) : m;
        }

      方法三、

        每次将 n 的最右边的 1 化为 0,直到 m >= n,则 n 即为 答案。

        public int rangeBitwiseAnd3(int m, int n) {
            while(m < n)
                n = n & (n - 1); // 每次将 n 最右边一个 1 去除
            return n;
        }
  • 相关阅读:
    浅析TCP /UDP/ IP协议
    大小端模式
    小技巧—计算内存
    浅谈启发式合并
    浅谈换根DP
    POJ 3585 Accumulation Degree
    OSGi类加载问题
    Redis缓存集群方案
    Tair分布式缓存
    Tedis:淘宝的Redis的Java客户端开发包
  • 原文地址:https://www.cnblogs.com/skillking/p/9818584.html
Copyright © 2020-2023  润新知