#include <iostream>
using namespace std;

template<size_t N, typename T>
size_t bitcount(T v, enable_if_t<(N <= 1)>* = 0)
{
	static const unsigned char BitsSetTable256[256] = 
	{
#		define B2(n) n,     n+1,     n+1,     n+2
#		define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#		define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
		B6(0), B6(1), B6(1), B6(2)
	};
	return BitsSetTable256[v & 0xff];
}

template<size_t N, typename T>
size_t bitcount(T v, enable_if_t<(N > 1)>* = 0)
{
	return bitcount<1>(v) + bitcount<N - 1>(v >> 8);
}

int main() {
	// your code goes here
	cout << bitcount<4>(0x01234567) << endl;
	cout << bitcount<8>(0x0123456789abcdefULL) << endl;
	return 0;
}