201. Bitwise AND of Numbers Range
阿新 • • 發佈:2017-10-25
我們 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.
含義:給一個範圍,返回這個範圍中所有的數按位相與最後的結果。
思路:
考慮數據的二進制形式。
對於整數
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(intm, 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