Domanda

Voglio contare il numero di bit impostati in un uint in Specman:

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

Qual è il modo migliore per farlo?

È stato utile?

Soluzione

Non conosco Specman, ma un altro modo in cui l'ho visto sembra un po 'sdolcinato, ma tende ad essere efficiente: mantenere un array di 256 elementi; ogni elemento dell'array è costituito dal numero di bit corrispondenti a quel valore. Ad esempio (pseudocodice):

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

Pertanto, bit_count 2 == 1, perché il valore 2, in binario, ha un singolo" 1 " po. Allo stesso modo, bit_count [255] == 8.

Quindi, suddividere uint in byte, utilizzare i valori byte per indicizzare l'array bit_count e aggiungere i risultati. Pseudocodice:

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

MODIFICA

Questo problema si presenta nel libro Beautiful Code , in il capitolo di Henry S. Warren. Inoltre, Matt Howells mostra un'implementazione del linguaggio C che calcola in modo efficiente un conteggio dei bit. Vedi questo rispondere .

Altri suggerimenti

Un modo che ho visto è:

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

pack (NULL, x) converte x in un elenco di bit.
count agisce nell'elenco e conta tutti gli elementi per i quali la condizione è valida. In questo caso la condizione è che l'elemento sia uguale a 1, che risulta dal numero di bit impostati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top