LeetCode - 201. Bitwise AND of Numbers Range

首先我們要明白的一點是二進制表示的奇數和偶數的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章