Я хочу подсчитать количество установленных битов в uint в Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
Как лучше всего это сделать?
Я хочу подсчитать количество установленных битов в uint в Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
Как лучше всего это сделать?
Я не знаю Specman, но другой способ, который я видел, выглядит немного дрянным, но имеет тенденцию быть эффективным: держите массив из 256 элементов; каждый элемент массива состоит из числа битов, соответствующих этому значению. Например (псевдокод):
bit_count = [0, 1, 1, 2, 1, ...]
Таким образом, bit_count2 == 1, потому что значение 2 в двоичном формате имеет один бит "1". Аналогично, bit_count[255] == 8.
Затем разбейте uint на байты, используйте значения байтов для индексации массива bit_count и добавьте результаты. Псевдокод:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
ИЗМЕНИТЬ
Эта проблема описана в книге Красивый код, в главе, написанной Генри С. Уоррен. Кроме того, Matt Howells показывает реализацию на языке C, которая эффективно вычисляет количество битов. См. этот ответ.
Один из способов, который я видел, это:
x_set_bits = pack(NULL, x).count(it == 1);
pack(NULL, x)
преобразует x
в список битов.count
действует на список и подсчитывает все элементы, для которых выполняется условие. В этом случае условие состоит в том, что элемент равен 1, что соответствует количеству установленных битов.