comment puis-je compter le nombre de bits définis dans un uint dans specman?

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

  •  10-07-2019
  •  | 
  •  

Question

Je souhaite compter le nombre de bits définis dans un uint dans Specman:

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

Quelle est la meilleure façon de faire cela?

Était-ce utile?

La solution

Je ne connais pas Specman, mais une autre façon de voir les choses que j'ai faite a l'air un peu ringarde, mais tend à être efficace: Conservez un tableau de 256 éléments; chaque élément du tableau est constitué du nombre de bits correspondant à cette valeur. Par exemple (pseudocode):

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

Ainsi, bit_count 2 == 1, car la valeur 2, en binaire, a un seul" 1 "" bit. De même, bit_count [255] == 8.

Ensuite, divisez l'uint en octets, utilisez les valeurs d'octet pour indexer dans le tableau nombre_bits et ajoutez les résultats. Pseudocode:

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

MODIFIER

Ce problème apparaît dans le livre Beautiful Code , dans le chapitre de Henry S. Warren. Matt Howells montre également une implémentation en langage C qui calcule efficacement le nombre de bits. Voir cette répondre .

Autres conseils

Une façon que j'ai vue est:

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

pack (NULL, x) convertit x en une liste de bits.
count agit sur la liste et compte tous les éléments pour lesquels la condition est vérifiée. Dans ce cas, la condition est que l'élément soit égal à 1, ce qui correspond au nombre de bits définis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top