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     }
  • 相关阅读:
    字串变换
    单词接龙
    二叉搜索树
    搜索专题(未完)
    单调栈
    单调队列练习(切蛋糕&好消息,坏消息)
    队列专题
    滑动窗口/【模板】单调队列
    Linux下如何查看硬件信息?
    Git 居然可以用来跟女神聊天?
  • 原文地址:https://www.cnblogs.com/wzj4858/p/7727920.html
Copyright © 2011-2022 走看看