1 unsigned popcount_64(uint64_t x)
   2 {
   3         static const uint64_t m1  = 0x5555555555555555LLU;
   4         static const uint64_t m2  = 0x3333333333333333LLU;
   5         static const uint64_t m4  = 0x0f0f0f0f0f0f0f0fLLU;
   6         static const uint64_t h01 = 0x0101010101010101LLU;
   7 
   8         x -= (x >> 1) & m1;
   9         x = (x & m2) + ((x >> 2) & m2);
  10         x = (x + (x >> 4)) & m4;
  11         return (x * h01) >> 56;
  12 }
  13 EXPORT_SYMBOL(popcount64);
  14 
  15 unsigned popcount_32(uint32_t x)
  16 {
  17         static const uint32_t m1  = 0x55555555;
  18         static const uint32_t m2  = 0x33333333;
  19         static const uint32_t m4  = 0x0f0f0f0f;
  20         static const uint32_t h01 = 0x01010101;
  21 
  22         x -= (x >> 1) & m1;
  23         x = (x & m2) + ((x >> 2) & m2);
  24         x = (x + (x >> 4)) & m4;
  25         return (x * h01) >> 24;
  26 }
  27 EXPORT_SYMBOL(popcount32);

BcacheWiki: Popcount (last edited 2011-09-15 23:50:09 by Kent)