2

我想在 Specman 中计算一个 uint 中的设置位数:

var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;

最好的方法是什么?

4

2 回答 2

4

我见过的一种方法是:

x_set_bits = pack(NULL, x).count(it == 1);

pack(NULL, x)转换x为位列表。
count作用于列表并计算条件成立的所有元素。在这种情况下,条件是元素等于 1,即设置的位数。

于 2009-01-12T11:41:04.493 回答
2

我不知道 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 语言实现,可以有效地计算位计数。看到这个答案

于 2009-01-12T12:40:23.997 回答