Как я могу посчитать количество установленных бит в Uint в Specman? - PullRequest
2 голосов
/ 12 января 2009

Я хочу посчитать количество установленных бит в uint в Specman:

var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;

Какой лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 12 января 2009

Я видел только один способ:

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

pack(NULL, x) преобразует x в список битов.
count действует в списке и подсчитывает все элементы, для которых выполняется условие. В этом случае условие состоит в том, что элемент равен 1, что соответствует количеству установленных битов.

2 голосов
/ 12 января 2009

Я не знаю 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]

РЕДАКТИРОВАТЬ

Этот вопрос обнаружен в книге Прекрасный код в главе Генри С. Уоррена. Кроме того, Мэтт Хауэллс показывает реализацию на языке C, которая эффективно рассчитывает количество битов. См. этот ответ .

...