@staticmethod
def min_and(a, b, c, d, w):
    """
        Lower 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: Lower bound of ANDing 2-intervals
        """
    m = 1 << w - 1
    while m != 0:
        if ~a & ~c & m != 0:
            temp = (a | m) & -m
            if temp <= b:
                a = temp
                break
            temp = (c | m) & -m
            if temp <= d:
                c = temp
                break
        m >>= 1
    return a & c
