我想设置位计数的数量在一个uint中的Specman:如何计算specman中uint的设置位数?
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
什么是做到这一点的最好方法是什么?我见过
我想设置位计数的数量在一个uint中的Specman:如何计算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,在二进制的,具有单个 “1” 比特。同样,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。
一种方法是:
x_set_bits = pack(NULL, x).count(it == 1);
pack(NULL, x)
转换x
成位名单。
count
作用于列表并计算条件成立的所有元素。在这种情况下,条件是元素等于1,这表示设置位的数量。
请参阅http://www.dalkescientific.com/writings/diary/archive/2008/07/03/hakmem_and_other_popcounts.html(来自http://stackoverflow.com/questions/109023/best-algorithm-to-count 32位整数中的位数) – jfs 2009-01-12 13:39:37