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.
Example 1:
Try it on Leetcode
Here while we are doing BITWISE AND from n, at some point it would be less than m. And at that point whatever m we do BITWISE AND it will be n,
Consider the rxample [5,7]
Take 7 -> 0000 0111 (7) & 0000 0110 (6) -> 0000 0110 (6)
Take 6 -> 0000 0110 (6) & 0000 0101 (5) -> 0000 0100 (4)
At this point it is less than m(i.e.,5), and it exits from loop. Then return n.
Consider if n at that point is doing BITWISE AND it will be again 4.
0000 0101 (5) & 0000 0100 (4) = 0000 0100 (4)
METHOD 2:
Example 1:
Input: [5,7] Output: 4
Example 2:
Input: [0,1] Output: 0
METHOD 1:
class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        if(m == 0){
            return 0;
        }
        while(n > m){
            n = n & n-1;
            System.out.println(n);
        }
        
        return  n;
        
    }
}
 
Try it on Leetcode
Here while we are doing BITWISE AND from n, at some point it would be less than m. And at that point whatever m we do BITWISE AND it will be n,
Consider the rxample [5,7]
Take 7 -> 0000 0111 (7) & 0000 0110 (6) -> 0000 0110 (6)
Take 6 -> 0000 0110 (6) & 0000 0101 (5) -> 0000 0100 (4)
At this point it is less than m(i.e.,5), and it exits from loop. Then return n.
Consider if n at that point is doing BITWISE AND it will be again 4.
0000 0101 (5) & 0000 0100 (4) = 0000 0100 (4)
METHOD 2:
class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        if(m == 0){
            return 0;
        }
        int count = 0;
        while(m != n){
            m = m>>1;
            n = n>>1;
            count++;
        }
        
        return  m<<count;
        
    }
}     Here, we are going to do right shift both m, n by 1. After doing both right shifts calculate count value.
At some point both m, n will be equal [which will be either 1 or 0] [It can be found only after doing written works with different numbers BITWISE AND operations]. After that, do left shift that count value with m. Finally it will be the result.
0000 0101 (5) >> 1 = 0000 0010 (2)
0000 0111 (7) >> 1 = 0000 0011 (3)
count becomes 1.
0000 0010 (2) >> 1 = 0000 0001(1)
0000 0011 (3) >> 1 = 0000 0001 (1)
count becomes 2.
Then it exits from loop. And finally left shift by 2.
0000 0001 << 2 = 0000 0100 (4) which is the answer.
Comments
Post a Comment