¿Cómo puedo contar el número de bits establecidos en un uint en specman?
-
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?
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.