#include <iostream>
#include <type_traits>

size_t bitcount(unsigned int v) {
  size_t ret = 0;
  while (v != 0) {
    v &= v - 1;
    ret++;
  }
  return ret;
}

size_t bitcount(unsigned char v) {
  size_t ret = 0;
  while (v != 0) {
    v &= v - 1;
    ret++;
  }
  return ret;
}

template<int N>
typename std::enable_if<(N == 1), size_t>::type bitcount_p(unsigned char *c) {
  return bitcount(*c);
}

template<int N>
typename std::enable_if<(N > 1), size_t>::type bitcount_p(unsigned char *c) {
  return bitcount(*c) + bitcount_p<N-1>(c+1);
}

template<int N>
typename std::enable_if<(N < sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  return bitcount_p<N>(reinterpret_cast<unsigned char *>(v));
}

template<int N>
typename std::enable_if<(N == sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  return bitcount(*v);
}

template<int N>
typename std::enable_if<(N > sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  return bitcount(*v) + bitcount_p<N - sizeof(unsigned int)>(v+1);
}

template<typename T>
size_t bitcount(T v) {
  return bitcount_p<sizeof(T)>( reinterpret_cast<unsigned int *>(&v) );
}

int main() {
	std::cout << bitcount(0x01234567) << std::endl;
	std::cout << bitcount(0x0123456789abcdefULL) << std::endl;
	return 0;
}
