Logo

Programming-Idioms

  • Python
  • Perl
$c = unpack '%b*', pack 'i', $i;

Perl pack 'i' interprets $i as an integer and packs it into a byte string. Unpack '%b' converts it to a list of zeros and ones. In scalar context, $c gets the count of the list.
# Not best, but simple:
$c=0;
while ($i) {
   $c += $i&1;
   $i /= 2;
}
c = i.bit_count()

For Python 3.10+
c = bin(i).count("1")
#include <stdint.h>
uint32_t c = i;
c = (c & 0x55555555) + ((c & 0xAAAAAAAA) >> 1);
c = (c & 0x33333333) + ((c & 0xCCCCCCCC) >> 2);
c = (c & 0x0F0F0F0F) + ((c & 0xF0F0F0F0) >> 4);
c = (c & 0x00FF00FF) + ((c & 0xFF00FF00) >> 8);
c = (c & 0x0000FFFF) + ((c & 0xFFFF0000) >> 16);

add even and odd bits
then add even and odd pairs of bits
then add even and odd quadruples of bits
then add even and odd octets of bits
then add whatever groups of 16 bits are called
done

with gcc you can also use the function _builtin_popcount

New implementation...
< >
deleplace