Как я могу посчитать количество установленных бит в Uint в Specman?
-
10-07-2019 - |
Вопрос
Я хочу посчитать количество установленных бит в 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_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, которая эффективно рассчитывает количество битов. Смотрите это ответить .
Другие советы
Один из способов, которые я видел, это:
x_set_bits = pack(NULL, x).count(it == 1);
pack (NULL, x)
преобразует x
в список битов.
count
действует в списке и подсчитывает все элементы, для которых выполняется условие. В этом случае условие состоит в том, что элемент равен 1, что соответствует количеству установленных битов.