如何计算specman中uint中的设置位数?

时间:2009-01-12 11:39:12

标签: specman

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

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

最好的方法是什么?

2 个答案:

答案 0 :(得分:4)

我见过的一种方式是:

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

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

答案 1 :(得分:2)

我不知道Specman,但我看到这样做的另一种方式看起来有点俗气,但往往效率很高:保持256个元素阵列;数组的每个元素由对应于该值的位数组成。例如(伪代码):

bit_count = [0, 1, 1, 2, 1, ...]

因此,bit_count 2 == 1,因为二进制值2具有单个“1”位。 Simiarly,bit_count [255] == 8。

然后,将uint分解为字节,使用字节值索引到bit_count数组,并添加结果。伪代码:

total = 0
for byte in list_of_bytes
    total = total + bit_count[byte]

编辑

这个问题出现在亨利·沃伦的章节Beautiful Code中。此外,Matt Howells展示了一种有效计算位数的C语言实现。请参阅this answer