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     }

 

posted @ 2017-10-25 11:24  daniel456  阅读(100)  评论(0编辑  收藏  举报