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     }
  • 相关阅读:
    github 代理加速
    centos系统语言设置为中文
    红帽 / CentOS安装Jenkins
    查看api有没有更新到位
    永久关闭Windows10或Windows11的系统自动更新
    api传文件连接超时
    docker日常使用
    开发者工具批量替换
    Linux常用工具安装
    office密钥
  • 原文地址:https://www.cnblogs.com/wzj4858/p/7727920.html
Copyright © 2011-2022 走看看