fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. size_t bitcount(unsigned int v) {
  5. size_t ret = 0;
  6. while (v != 0) {
  7. v &= v - 1;
  8. ret++;
  9. }
  10. return ret;
  11. }
  12.  
  13. size_t bitcount(unsigned char v) {
  14. size_t ret = 0;
  15. while (v != 0) {
  16. v &= v - 1;
  17. ret++;
  18. }
  19. return ret;
  20. }
  21.  
  22. template<int N>
  23. typename std::enable_if<(N == 1), size_t>::type bitcount_p(unsigned char *c) {
  24. return bitcount(*c);
  25. }
  26.  
  27. template<int N>
  28. typename std::enable_if<(N > 1), size_t>::type bitcount_p(unsigned char *c) {
  29. return bitcount(*c) + bitcount_p<N-1>(c+1);
  30. }
  31.  
  32. template<int N>
  33. typename std::enable_if<(N < sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  34. return bitcount_p<N>(reinterpret_cast<unsigned char *>(v));
  35. }
  36.  
  37. template<int N>
  38. typename std::enable_if<(N == sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  39. return bitcount(*v);
  40. }
  41.  
  42. template<int N>
  43. typename std::enable_if<(N > sizeof(unsigned int)), size_t>::type bitcount_p(unsigned int *v) {
  44. return bitcount(*v) + bitcount_p<N - sizeof(unsigned int)>(v+1);
  45. }
  46.  
  47. template<typename T>
  48. size_t bitcount(T v) {
  49. return bitcount_p<sizeof(T)>( reinterpret_cast<unsigned int *>(&v) );
  50. }
  51.  
  52. int main() {
  53. std::cout << bitcount(0x01234567) << std::endl;
  54. std::cout << bitcount(0x0123456789abcdefULL) << std::endl;
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
12
32