2009-01-12 21 views

回答

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] 

编辑

这个问题表明了书中Beautiful Code,由亨利·沃伦节。另外,Matt Howells展示了一种C语言实现,可高效计算一个位数。见this answer

+0

请参阅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

3

一种方法是:

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

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