我想在 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 = ?;
最好的方法是什么?
我见过的一种方法是:
x_set_bits = pack(NULL, x).count(it == 1);
pack(NULL, x)
转换x
为位列表。
count
作用于列表并计算条件成立的所有元素。在这种情况下,条件是元素等于 1,即设置的位数。
我不知道 Specman,但我看到的另一种方法看起来有点俗气,但往往是有效的:保持 256 元素数组;数组的每个元素都由与该值对应的位数组成。例如(伪代码):
bit_count = [0, 1, 1, 2, 1, ...]
因此,bit_count 2 == 1,因为二进制值 2 有一个“1”位。同样,bit_count[255] == 8。
然后,将 uint 分解为字节,使用字节值对 bit_count 数组进行索引,并将结果相加。伪代码:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
编辑
这个问题出现在Henry S. Warren 的章节Beautiful Code中。此外,Matt Howells 展示了一种 C 语言实现,可以有效地计算位计数。看到这个答案。