1

私はここでスタンフォードビットいじりハックを読んでいます: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable

ルックアップ テーブルで設定されたビット数をカウントするには、2 つの質問があります。1)

c = BitsSetTable256[v & 0xff] + 
BitsSetTable256[(v >> 8) & 0xff] + 
BitsSetTable256[(v >> 16) & 0xff] + 
BitsSetTable256[v >> 24]; 

これはどのように正しいですか。したがって、テーブルには、256 個の数値 = 2^8 に対して事前計算されたビット数が含まれています。これで、ビット セットを計算するための 32 ビットの数値が得られました。v31..v24 v23...v16 v15...v8 v7..v0

必要なことは、ルックアップ テーブルで 8 ビットごとにルックアップすることだけです。

したがって、代わりに

c = BitsSetTable256[v & 0x0F] + 
    BitsSetTable256[v>>8 & 0x0F] + 
    BitsSetTable256[v>>16 & 0x0F] +
    BitsSetTable256[v>>24]

私のポイントは、256 の範囲で正しい数値を取得するには、FF ではなく 0x0F を使用して & を実行する必要があるということです。

ここで何が欠けていますか?: ( : (

2)また、このマクロは、ビットセットの同じビットいじりハックセクションから何を意味しますか

static const unsigned char BitsSetTable256[256] = 
{
 #   define B2(n) n,     n+1,     n+1,     n+2
 #   define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
 #   define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
 B6(0), B6(1), B6(1), B6(2)
};

これをどう展開するか。

ありがとう

4

1 に答える 1