#include <iostream>
#include <limits>
#include <cstdint>

template<class T>
int GetBitDigit(const T& N){
	if (N == 0) return 0;
	for (std::size_t i = 0; i < std::numeric_limits<T>::digits; i++){
		if ((N >> i) == 0) return i;
	}
	return -1;
}

std::uint64_t MakeBitOnArray(std::size_t N){
	std::uint64_t Num = 0;
	for (std::size_t i = 0; i < N; i++){
		Num <<= 1;
		Num |= 1;
	}
	return Num;
}

std::uint64_t MakeHoge(std::uint64_t N){
	auto D = GetBitDigit(N);
	auto B = MakeBitOnArray(D);

	auto R = N^B;

	return R & B;

}

int main(){

	std::uint64_t N = 0;
	std::uint64_t A = 0;

	N = 1;
	A = MakeHoge(N);
	std::cout << N << "->" << A <<std::endl;
	N = 12345;
	A = MakeHoge(N);
	std::cout << N << "->" << A <<std::endl;
	N = 256;
	A = MakeHoge(N);
	std::cout << N << "->" << A <<std::endl;
	return 0;
}