ある整数 xに対して、 x & (x-1)が最も右の "1"であるビットを削除するという
事実を使って、bitcountの高速版を作れという問題。x & (x-1)がこうなる理由は
x & (x-1)をすると、最も右の 1ビット以下のビットが反転するため、それと論理積を
とるとすべて 0になるため。
#include <stdio.h> #include <assert.h> #include "util.h" static int bitcount(unsigned int x); static void test_bitcount(void ); int main(void) { test_bitcount(); return 0; } static void test_bitcount() { assert(bitcount(0x0) == 0); assert(bitcount(0x1) == 1); assert(bitcount(0xf) == 4); assert(bitcount(0xffff) == 16); assert(bitcount(0xffffffff) == 32); } static int bitcount(unsigned int x) { int count = 0; if (x >= 1) { count = 1; } while ((x = (x & (x - 1))) != 0) { count++; } return count; }