リスト2●任意の32ビット値の立っているビットを「計算」する方法
4ビット単位で処理する方法を32ビットに拡張した
unsigned int nValue = <ユーザーが入力した値>;
int nCount;
__asm{
mov eax, nValue ;eax = nValue
shld ebx, eax, 31 ;ebx = eax >> 1
and ebx, 77777777h ;ebx = ebx & 0x77777777
shld ecx, ebx, 31 ;ecx = eax >> 2
and ecx, 33333333h ;ecx = ecx & 0x33333333
shld edx, ecx, 31 ;edx = eax >> 3
and edx, 11111111h ;edx = edx & 0x11111111
sub eax, ebx ;eax = eax - ebx
sub eax, ecx ;eax = eax - ecx
sub eax, edx ;eax = eax - edx
shld ebx, eax, 28 ;ebx = eax >> 4
add eax, ebx ;eax = eax + ebx
and eax, 0f0f0f0fh ;eax = eax & 0x0f0f0f0f
shld ebx, eax, 16 ;ebx = eax >> 16
add eax, ebx ;eax = eax + ebx
add al, ah ;al = al + ah
and eax, 0ffh ;eax = eax & 0xff
mov nCount, eax ;nCount = eax
}