#include <climits>
#include <cmath>
#include <bitset>
#include <iostream>

template <typename T>
T build_mask(T num) {
	const int up_to_bit = log2(num);
	for (int i = 0; i < up_to_bit; i++)
		num |= 1 << i;
	return num;
}

template <typename T>
std::bitset<sizeof(T) * CHAR_BIT> get_bits(T num) {
	return std::bitset<sizeof(T) * CHAR_BIT>(num);
}

int main() {
	int32_t msk = 9;
	int32_t nMsk = ~msk & build_mask(msk);
	
	std::cout << "value: " << msk << std::endl;
	std::cout << "bits : " << get_bits(msk) << std::endl;
	std::cout << "mask : " << get_bits(build_mask(msk)) << std::endl;
	
	std::cout << "value: " << nMsk << std::endl;
	std::cout << "bits : " << get_bits(nMsk) << std::endl;

	return 0;
}
