如何计算specman中uint中设置位的数量?
我想计算 Specman 中 uint 中设置位的数量:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
最好的方法是什么?
I want to count the number of set bits in a uint in Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
What's the best way to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我见过的一种方法是:
pack(NULL, x)
将x
转换为位列表。count
作用于列表并计算条件成立的所有元素。 在这种情况下,条件是该元素等于 1,即设置的位数。One way I've seen is:
pack(NULL, x)
convertsx
to a list of bits.count
acts on the list and counts all the elements for which the condition holds. In this case the condition is that the element equals 1, which comes out to the number of set bits.我不了解 Specman,但我见过的另一种方法看起来有点俗气,但往往很有效:保留一个 256 元素的数组; 数组的每个元素都由与该值对应的位数组成。 例如(伪代码):
因此,bit_count2 == 1,因为二进制值 2 有一个“1”位。 同样,bit_count[255] == 8。
然后,将 uint 分解为字节,使用字节值索引到 bit_count 数组,并将结果相加。 伪代码:
编辑
这个问题出现在书中美丽的代码,在亨利·S·沃伦 (Henry S. Warren) 的章节中。 此外,Matt Howells 还展示了一种可以有效计算位数的 C 语言实现。 请参阅此回答。
I don't know Specman, but another way I've seen this done looks a bit cheesy, but tends to be efficient: Keep a 256-element array; each element of the array consists of the number of bits corresponding to that value. For example (pseudocode):
Thus, bit_count2 == 1, because the value 2, in binary, has a single "1" bit. Simiarly, bit_count[255] == 8.
Then, break the uint into bytes, use the byte values to index into the bit_count array, and add the results. Pseudocode:
EDIT
This issue shows up in the book Beautiful Code, in the chapter by Henry S. Warren. Also, Matt Howells shows a C-language implementation that efficiently calculates a bit count. See this answer.