Как я могу посчитать количество установленных бит в Uint в Specman?

StackOverflow https://stackoverflow.com/questions/435188

  •  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, что соответствует количеству установленных битов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top