# https://leetcode.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/description/
"""
Given 3 positives numbers a, b and c. Return the minimum flips required in some bits of a and b to make ( a OR b == c ). (bitwise OR operation).
Flip operation consists of change any single bit 1 to 0 or change the bit 0 to 1 in their binary representation.

Example 1:
Input: a = 2, b = 6, c = 5
Output: 3
Explanation: After flips a = 1 , b = 4 , c = 5 such that (a OR b == c)

Example 2:
Input: a = 4, b = 2, c = 7
Output: 1

Example 3:
Input: a = 1, b = 2, c = 3
Output: 0


Constraints:
1 <= a <= 10^9
1 <= b <= 10^9
1 <= c <= 10^9
"""


def min_flips(a: int, b: int, c: int) -> int:
    def get_bin(x: int) -> str:
        # len(bin(10**9)[2:]) = 30
        return bin(x)[2:].zfill(30)

    bin_a, bin_b, bin_c = get_bin(a), get_bin(b), get_bin(c)
    ret = 0
    for i, j, k in zip(bin_a, bin_b, bin_c):
        i, j, k = int(i), int(j), int(k)
        match k:
            case 0:
                ret += i + j
            case 1:
                if i == 0 and j == 0:
                    ret += 1
    return ret


def min_flips(a: int, b: int, c: int) -> int:
    ret = 0
    while a or b or c:
        if c & 1:
            ret += 0 if ((a & 1) or (b & 1)) else 1
        else:
            ret += (a & 1) + (b & 1)

        a >>= 1
        b >>= 1
        c >>= 1
    return ret
