我想计算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 <!>“;位。 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语言实现。请参见这回答

其他提示

我见过的一种方式是:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top