我想计算Specman中的uint中的设置位数:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
最好的方法是什么?
答案 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。