// Bitwise Operators template <typename T> T operator&(T lhs, uint128_t rhs){ T out = lhs & (T) rhs.lower(); return out; }
template <typename T> T operator*(T lhs, uint128_t rhs){ return lhs * rhs.lower(); }
template <typename T> bool operator<=(T lhs, uint128_t rhs){ if (rhs.upper()) return true; return ((uint64_t) lhs <= rhs.lower()); }
template <typename T> bool operator>=(T lhs, uint128_t rhs){ if (rhs.upper()) return false; return ((uint64_t) lhs >= rhs.lower()); }
template <typename T> bool operator!=(T lhs, uint128_t rhs){ return (rhs.upper() | ((uint64_t) lhs != rhs.lower())); }
// Comparison Operators template <typename T> bool operator==(T lhs, uint128_t rhs){ return (!rhs.upper() && ((uint64_t) lhs == rhs.lower())); }
template <typename T> T operator^=(T & lhs, uint128_t rhs){ lhs ^= (T) rhs.lower(); return lhs; }