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

    含义:给一个范围,返回这个范围中所有的数按位相与最后的结果。

    思路:

    考虑数据的二进制形式。

    对于整数mn,在数值连续变化的过程中,它们的某些高位比特是相同的,而只有低位的比特连续变化。

    例如:

    整数:33,34,35,36

    它们的二进制形式是(为了简单,我们假设每个数值有8个bits):

    33 : 00100001
    34 : 00100010
    35 : 00100011
    36 : 00100100

    不难看出,它们都具有00100xxx的形式,共同的高位比特是:00100。如果进行按位与运算(&)的话,这些高位是保持不变的。

    再看低位(低3位比特)。与运算之后的结果是000


    由上面的分析,可以得到:

    为了得到它们与运算的结果,我们只需要找出区间[m, n]范围内所有数值的共同高比特位即可。

    又因为mn是这些数中相差最大的,所以它俩拥有的共同高位比特也是最少的。

    所以计算中只需要用mn即可。

    代码如下:

     1     public int rangeBitwiseAnd(int m, int n) {
     2 //        http://www.jianshu.com/p/ea0f6aa14ef4
     3 //        对于整数m到n,在数值连续变化的过程中,它们的某些高位比特是相同的,而只有低位的比特连续变化。
     4 //        整数:33,34,35,36  共同的高位比特是:00100。进行按位与运算(&)的话,高位是保持不变的。低3位比特与运算之后的结果是000
     5 //        为了得到它们与运算的结果,我们只需要找出区间[m, n]范围内所有数值的共同高比特位即可。
     6         int offset = 0;
     7         while (m != n)  // 找出m、n的共同高位比特。
     8         {
     9             m >>= 1;
    10             n >>= 1;
    11             offset++;
    12         }
    13         return m << offset;        
    14     }
  • 相关阅读:
    前端的推荐资源
    Python 学习日志(一)
    遇到的一些elasticsearch报错信息整理
    记hyper-v导致的privoxy error(fatal error: can't bind to 127.0.0.1:1081(error number:0)),附解决方法
    Java动态代理学习笔记
    spring依赖注入中p命名空间和c命名空间区别
    python "二维" 字典(字典嵌套)
    [剑指offer] 数组中的逆序对
    [剑指offer] 复杂链表的复制
    [剑指offer] 8-10做题笔记
  • 原文地址:https://www.cnblogs.com/wzj4858/p/7727920.html
Copyright © 2011-2022 走看看