# https://leetcode.com/problems/reverse-bits/
# ---------------------------------------------------


# Runtime Complexity: O(1)
# Space Complexity: O(1)
# Idea: for 8 bit binary number abcdefgh, the process is as follow:
#     abcdefgh -> efghabcd -> ghefcdab -> hgfedcba
class Solution:
    def reverseBits(self, n: int) -> int:
        n = (n >> 16) | (n << 16)
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8)
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4)
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2)
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1)

        return n

# ---------------------------------------------------
#                    Test Cases
# ---------------------------------------------------
solution = Solution()
# 00000010100101000001111010011100 (43261596) => 00111001011110000010100101000000 (964176192)
print(solution.reverseBits(43261596))