1. 程式人生 > 實用技巧 >中等-201-數字範圍按位與

中等-201-數字範圍按位與

LeetCode201
視訊解析
給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。
示例 1: 
輸入: [5,7]
輸出: 4
示例 2:
輸入: [0,1]
輸出: 0

該題在於找出m和n的公共字首,在按n的位數往後面補齊0.
m到n之間的數都有該字首,則按位與操作使得這些字首保持不變。而字首後一位數m為0,n為1,無論m、n該位後面的數字為多少,
在m到n之間一定存在一個數,其在字首後面的數為1000... 該數與m按位與得到(字首0000...)
尋找公共字首有兩個方法,和(計數二進位制數字中1的個數)該題類似。

  1. 位移
    m和n同時向右位移,直到m、n相等時,餘下的為字首。
    public int rangeBitwiseAnd(int m, int n) {
        int count = 0;
        while(m!=n){
            count++;
            m >>= 1;
            n >>= 1;
        }
        n <<= count;
        return n;
    }
  1. BK演算法
    n=n&(n-1)使得n將最右邊的1轉化為0。當n<=m時,n字首後面的數已經全為0.直接返回.
    public int rangeBitwiseAnd(int m, int n) {
        while(m<n)
            n&=(n-1);
        return n;
    }