一日一コード まだまだ続く九回目

Joel on Software の面接で出される問題を解いてみるこのシリーズ。
今日はビットカウンタ。今までで一番簡単な気がする。

ルックアップテーブル C#


class BitCount
{
static private byte[] LookUpTable = null;

static public int bitCount( byte d) //立っているビットを返す。
{
if( LookUpTable != null ) return LookUpTable[d]; //テーブルがあればそれを返す。

//テーブルを作成する。初期化
LookUpTable = new byte[256];
for( int i=0; i < 256; i++)
{
int cnt=0; d = (byte)i;
while( d != 0 ) //右にずらしていき、ゼロになったら抜ける。
{
if( (d & 0x01) == 0x01 ) cnt++; //下位1ビットが立っていたらカウントする。
d = (byte)(d >> 1);
}
LookUpTable[i] = (byte)cnt;
}
return LookUpTable[d];
}

static public int Main()
{
Console.WriteLine( bitCount( (byte)0) );
Console.WriteLine( bitCount( (byte)63) );
Console.WriteLine( bitCount( (byte)255));

return 0;
}
}

その他の実装