Specman の uint に設定されたビット数をカウントしたい:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
これを行う最善の方法は何ですか?
Specman の uint に設定されたビット数をカウントしたい:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
これを行う最善の方法は何ですか?
私は Specman を知りませんが、私が見た別の方法は少し安っぽく見えますが、効率的である傾向があります: 256 要素の配列を保持します。配列の各要素は、その値に対応するビット数で構成されます。例(疑似コード):
bit_count = [0, 1, 1, 2, 1, ...]
したがって、bit_count 2 == 1 は、2 進数の値 2 には単一の「1」ビットがあるためです。同様に、bit_count[255] == 8.
次に、uint をバイトに分割し、バイト値を使用して bit_count 配列にインデックスを付け、結果を追加します。擬似コード:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
編集
この問題は、本Beautiful Codeの Henry S. Warren による章に記載されています。また、Matt Howells は、ビット カウントを効率的に計算する C 言語の実装を示しています。この回答を参照してください。