ビットカウント
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だからなのかしら。
うーん、それにしても僕のプログラムは遅すぎる。プログラミングも遅い。まあいっか。