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.
含义:给一个范围,返回这个范围中所有的数按位相与最后的结果。
思路:
考虑数据的二进制形式。
对于整数
m
到n
,在数值连续变化的过程中,它们的某些高位比特是相同的,而只有低位的比特连续变化。
例如:
整数:33,34,35,36
它们的二进制形式是(为了简单,我们假设每个数值有8个bits):
33 : 00100001
34 : 00100010
35 : 00100011
36 : 00100100
不难看出,它们都具有00100xxx
的形式,共同的高位比特是:00100
。如果进行按位与运算(&)
的话,这些高位是保持不变的。
再看低位(低3位比特)。与运算
之后的结果是000
。
由上面的分析,可以得到:
为了得到它们与运算
的结果,我们只需要找出区间[m, n]
范围内所有数值的共同高比特位即可。
又因为m
和n
是这些数中相差最大的,所以它俩拥有的共同高位比特也是最少的。
所以计算中只需要用m
和n
即可。
代码如下:
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 }