[LeetCode]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.

方法

直接對所有數按位與,會超時,因此只能采用別的方法。
對于[1,3], 對應二進制位01,010,011,按位與為0;對于[5,7],對應二進制為0101,0110,0111,按位與為0100
對于[m,n],如果m!=n,那么m和n最右一位按位與必然為0;同時將m,n都右移一位,用bits記錄移位數,如果m!=n,繼續將m,n右移一位。最后m==n時,將m<<bits位即可,此時m可以為0或為其他值。如果m為0,n也為0,那么m和n的位數并不相同,因此結果為0;如果m不為0,那么m和n前幾位必然相同,用m<<bits就可以得到最后結果。

C代碼
#include <assert.h>

int rangeBitwiseAnd(int m, int n) {
    int bits = 0;
    while(m != n) {
        m >>= 1;
        n >>= 1;
        bits++;
    }
    return m<<bits;
}

/**
int rangeBitwiseAnd(int m, int n) {
    int bitwiseAnd = m;
    while(m <= n) {
        bitwiseAnd &= m;
        m++;
    }
    return bitwiseAnd;
}
*/

int main() {
    assert(rangeBitwiseAnd(5,7) == 4);
    assert(rangeBitwiseAnd(1,3) == 0);

    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容