1. 程式人生 > >201. Bitwise AND of Numbers Range

201. Bitwise AND of Numbers Range

我們 you 與運算 this should 整數 bits urn public

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