201. Bitwise AND of Numbers Range

Posted andywu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     }

 

以上是关于201. Bitwise AND of Numbers Range的主要内容,如果未能解决你的问题,请参考以下文章

201. Bitwise AND of Numbers Range

201. Bitwise AND of Numbers Range

201. Bitwise AND of Numbers Range

201. Bitwise AND of Numbers Range

LeetCode201 Bitwise AND of Numbers Range Java 题解

leetcode 201.Bitwise AND of Numbers Range