code: def max_and(a, b, c, d, w):
          
          m = (1 << (w - 1))
          while m != 0:
              if ((~d) & b & m) != 0:
                  temp = (b & ~m) | (m - 1)
                  if temp >= a:
                      b = temp
                      break
              elif (d & (~b) & m) != 0:
                  temp = (d & ~m) | (m - 1)
                  if temp >= c:
                      d = temp
                      break
              m >>= 1
          return b & d
docs: Upper bound of result of ANDing 2-intervals.
  
          :param a: Lower bound of first interval
          :param b: Upper bound of first interval
          :param c: Lower bound of second interval
          :param d: Upper bound of second interval
          :param w: bit width
          :return: Upper bound of ANDing 2-intervals