¿Cómo puedo contar el número de bits establecidos en un uint en specman?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Quiero contar el número de bits establecidos en un uint en Specman:

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

¿Cuál es la mejor manera de hacer esto?

¿Fue útil?

Solución

No conozco a Specman, pero otra forma en que he visto esto parece un poco cursi, pero tiende a ser eficiente: mantener una matriz de 256 elementos; Cada elemento de la matriz consiste en el número de bits correspondientes a ese valor. Por ejemplo (pseudocódigo):

bit_count = [0, 1, 1, 2, 1, ...]

Por lo tanto, bit_count 2 == 1, porque el valor 2, en binario, tiene un solo" 1 " poco. De manera similar, bit_count [255] == 8.

Luego, divida el uint en bytes, use los valores de bytes para indexar en la matriz bit_count y agregue los resultados. Pseudocódigo:

total = 0
for byte in list_of_bytes
    total = total + bit_count[byte]

EDITAR

Este problema aparece en el libro Beautiful Code , en El capítulo de Henry S. Warren. Además, Matt Howells muestra una implementación en lenguaje C que calcula eficientemente un recuento de bits. Consulte esto responder .

Otros consejos

Una forma que he visto es:

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

pack (NULL, x) convierte x en una lista de bits.
count actúa en la lista y cuenta todos los elementos para los que se cumple la condición. En este caso, la condición es que el elemento sea igual a 1, que se obtiene con el número de bits establecidos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top