int bitcount(long i) {
  i = ((i & 0xAAAAAAAAL) >> 1) + (i & 0x55555555L);
  i = ((i & 0xCCCCCCCCL) >> 2) + (i & 0x33333333L);
  i = ((i & 0xF0F0F0F0L) >> 4) + (i & 0x0F0F0F0FL);
  i = ((i & 0xFF00FF00L) >> 8) + (i & 0x00FF00FFL);
  i = ((i & 0xFFFF0000L) >> 16) + (i & 0x0000FFFFL);
  return (int)i;
}


x86 assembly (clang, -O0):
<bitcount>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movabs $0xaaaaaaaa,%rax
and    -0x8(%rbp),%rax
sar    $0x1,%rax
mov    -0x8(%rbp),%rcx
and    $0x55555555,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movabs $0xcccccccc,%rax
and    -0x8(%rbp),%rax
sar    $0x2,%rax
mov    -0x8(%rbp),%rcx
and    $0x33333333,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movabs $0xf0f0f0f0,%rax
and    -0x8(%rbp),%rax
sar    $0x4,%rax
mov    -0x8(%rbp),%rcx
and    $0xf0f0f0f,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movabs $0xff00ff00,%rax
and    -0x8(%rbp),%rax
sar    $0x8,%rax
mov    -0x8(%rbp),%rcx
and    $0xff00ff,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movabs $0xffff0000,%rax
and    -0x8(%rbp),%rax
sar    $0x10,%rax
mov    -0x8(%rbp),%rcx
and    $0xffff,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bitcount>:
mov    %rdi,%rax
shr    %rax
and    $0x55555555,%eax
and    $0x55555555,%edi
add    %rax,%rdi
mov    %rdi,%rax
shr    $0x2,%rax
and    $0x33333333,%eax
and    $0x33333333,%edi
add    %rax,%rdi
mov    %rdi,%rax
shr    $0x4,%rax
and    $0x7070707,%eax
and    $0x7070707,%edi
add    %rax,%rdi
mov    %rdi,%rax
shr    $0x8,%rax
and    $0xf000f,%eax
and    $0xf000f,%edi
add    %rax,%rdi
movzwl %di,%ecx
mov    %rdi,%rax
shr    $0x10,%rax
add    %ecx,%eax
ret

LLVM IR (-O0):
define i32 @bitcount(i64 %0) {
%2 = alloca i64
store i64 %0, i64* %2
%3 = load i64, i64* %2
%4 = and i64 %3, 2863311530
%5 = ashr i64 %4, 1
%6 = load i64, i64* %2
%7 = and i64 %6, 1431655765
%8 = add nsw i64 %5, %7
store i64 %8, i64* %2
%9 = load i64, i64* %2
%10 = and i64 %9, 3435973836
%11 = ashr i64 %10, 2
%12 = load i64, i64* %2
%13 = and i64 %12, 858993459
%14 = add nsw i64 %11, %13
store i64 %14, i64* %2
%15 = load i64, i64* %2
%16 = and i64 %15, 4042322160
%17 = ashr i64 %16, 4
%18 = load i64, i64* %2
%19 = and i64 %18, 252645135
%20 = add nsw i64 %17, %19
store i64 %20, i64* %2
%21 = load i64, i64* %2
%22 = and i64 %21, 4278255360
%23 = ashr i64 %22, 8
%24 = load i64, i64* %2
%25 = and i64 %24, 16711935
%26 = add nsw i64 %23, %25
store i64 %26, i64* %2
%27 = load i64, i64* %2
%28 = and i64 %27, 4294901760
%29 = ashr i64 %28, 16
%30 = load i64, i64* %2
%31 = and i64 %30, 65535
%32 = add nsw i64 %29, %31
store i64 %32, i64* %2
%33 = load i64, i64* %2
%34 = trunc i64 %33 to i32
ret i32 %34
}

LLVM IR (-O2):
define i32 @bitcount(i64 %0) {
%2 = lshr i64 %0, 1
%3 = and i64 %2, 1431655765
%4 = and i64 %0, 1431655765
%5 = add nuw nsw i64 %3, %4
%6 = lshr i64 %5, 2
%7 = and i64 %6, 858993459
%8 = and i64 %5, 858993459
%9 = add nuw nsw i64 %7, %8
%10 = lshr i64 %9, 4
%11 = and i64 %10, 117901063
%12 = and i64 %9, 117901063
%13 = add nuw nsw i64 %11, %12
%14 = lshr i64 %13, 8
%15 = and i64 %14, 983055
%16 = and i64 %13, 983055
%17 = add nuw nsw i64 %15, %16
%18 = lshr i64 %17, 16
%19 = and i64 %17, 31
%20 = add nuw nsw i64 %18, %19
%21 = trunc i64 %20 to i32
ret i32 %21
}