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

201. 數字範圍按位與

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        // 1.如果m與n二進位制位數不同的話 由m到n每一位二進位制位都出現過0,這裡可以解釋為:
        //由低位向高位進位時,低位會出現0,位數少的數所有位都會出現0 
        //比如從所有的三位二進位制數如111或110或100到1111 一定會出現1000的情況
        //只要這一位出現過0,那麼按位與的二進位制結果中這一位必然為0,
        //所以位數不同的話,每位都出現過0,結果為0。
        // 2.如果m與n二進位制位數相同的話,二進位制位從高位到低位必然會有一段公共字首,而m與n之間的數
        
//也必然有相同的公共字首,只有後面的二進位制位不同,且每位必會出現0 //所以最後的結果中後面位數全部為0,所以將m,n同時右移 //移到公共字首部分的時候 m n相同,然後再將後面的0補上,右移多少次就將它左移多少次就可以了 if(m == 0 || m == n) return m; int num = 0; while(m != n) { // 二進位制位不同的情況下,只有移動到0,它兩才會相等退出,0右移結果還是0 m >>= 1; n >>= 1; num
++; } return m << num; } }