BLANKFIELD

ビットカウント

BitBoard版ライフゲームを作っていて、8bitの立っているビットの数を数える関数を作ったら、中々速かったので晒し。いわゆるテーブル参照。

//0~15
int BitNumber[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3};

int bitCount(unsigned int n){
	//渡された8ビットをふたつに分け、配列から個数をとりだす。
	int cnt=0;
	//n32>>4		:左。シフトして下四桁のみにする
	//n32&0x0F	:右。ビットマスクして下四桁のみにする

	cnt=BitNumber[n&0x0F]+BitNumber[n>>4];

	return cnt;
}

引数はどうやらunsigned charよかunsigned intの方が速いようなので、8bitでなく32bitで渡しています。
32bitCPUだからなのかしら。

うーん、それにしても僕のプログラムは遅すぎる。プログラミングも遅い。まあいっか。