Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

Example 1:

Input: [5,7]
Output: 4
Example 2:

Input: [0,1]
Output: 0

Solution:


// 5 101
// 6 110
// 7 111
//   100

// 2  10
// 3  11
   // 10
//  f(m,n) = &[m, n] = &[m/2, n/2] * 2

func rangeBitwiseAnd(m int, n int) int {
    if m == n {
        return m
    }
    if m - n == 1 {
        return m & n
    }
    return rangeBitwiseAnd(m/2, n/2)  << 1  
}