# C# Solution with explanation

• ``````public int RangeBitwiseAnd(int mVal, int nVal) {
uint m = (uint) mVal;
uint n = (uint) nVal;

// Base case when m == n
if (m == n || n == 0) {
return (int)n;
}

// First of all we need to find the first most significate bit
// flipped on in the gratest number
uint result = 0x0;
uint nValue = n & bitmask;
if (nValue != 0x0) {
// We found the bit
break;
}

// Shift right
}

// No we need to look at both m and n and find the first position
// where there is a mismatch
uint nValue = n & bitmask;
uint mValue = m & bitmask;

if (nValue != 0x0) {
// The bit in n is 1
if (mValue != 0x0) {
// The bit in m is also flipped
// It means it will stay the same when adding values to m to reach n, so it
// will be flipped in the result AND
} else {
// The bit in m is not flipped
// It means that to reach m at some point this will be flipped and all the
// subsequent bits will be 0 during one of the additions (which clears out all
// the bits in the AND)
// To convince yourself, look at this:
// n:= hhhhzz1rrrrrrr
// m:= kkkkzz0qqqqqqq
// While adding to m to reach n, we will hit this combination at least
//     kkkkzz10000000
// Which clears out everything else.
return (int)result;
}
}

// The bit in n is 0
// We do not check if we have a match in m since that could not be possible
// othermise m is greater than n
// We just do nothing here except moving the bitmask