首先我們要明白的一點是二進制表示的奇數和偶數的AND操作最後一位一定是0,而如果m < n的話那麼他們之間一定會有一個奇數,一個偶數,接下來分別把m和n向右移動一位,我們可以重複上面的操作直到m >= n。當m >= n的時候,m和n之間不再有一個奇數和一個偶數,所以這時候我們就初步得到了答案,又因爲在尋找這一步的過程中我們把m和n都向右移動了moveNumer位,所以最後的答案還要把剛剛得到的數字向左移動moveNumber位,代碼如下:
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
if(m == 0) return 0;
int moveNumber = 0;
while(m < n){
m >>= 1;
n >>= 1;
moveNumber++;
}
return m << moveNumber;
}
}
第二種方法比第一種方法更加巧妙,注意在位運算中有一個技巧n & (n - 1)可以消去n二進制表示的最低位的1,所以當我們逐個消去n最低位的1直到m >= n的時候,我們就得到了最後的答案,因爲在m < n的情況下m和n之間必然有一個奇數和偶數,那麼他們的AND一定會把二進制最低位設置爲0。代碼如下:
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
if(m == 0) return 0;
while(m < n){
n &= (n - 1);
}
return n;
}
}
知識點:
1. 二進制操作的小技巧,n & (n - 1)是消去n的二進制表示的最低位的1