2010-11-22 32 views
0

J'utilise C++ pour la conception de modèle matériel avec SystemC. SystemC en tant qu'extension C++ introduit des types de données spécifiques utiles pour les descriptions de signaux et d'octets.accès sélectif aux bits sur les types de données avec C++

Comment puis-je accéder aux premiers bits d'un type de données en général, comme:

sc_bv<16> R0; 

ou accéder aux quatre premiers bits de tmp. Sc_bv est un type de données bit-vectoriel, qui stocke des séquences binaires. Maintenant, je veux les quatre premiers bits de ce type de données e. Mon contexte est C# et Java, par conséquent certaines structures d'API basées sur OOP et Reflexion me manquent en général. Je dois effectuer une conversion sur ce truc de bas niveau. Des trucs d'introduction utiles aideraient beaucoup.

Merci :), Wishi

Répondre

2

Pour sc_bv, vous pouvez utiliser l'opérateur d'indexation []

Pour l'int, il suffit d'utiliser des opérations normales avec des constantes, au niveau du bit par exemple Le bit le moins significatif de tmp est tmp & 1

1

Je ne peux pas vraiment parler pour SystemC (sons intéressants bien). Dans la normale C vous aviez lu les quatre bits inférieurs avec un masque comme ceci:

temp = R0 & 0xf; 

et écrivez en seulement quatre bits inférieurs (en supposant un registre 32 bits, et la température < 16) comme ceci:

R0 = (R0 & 0xfffffff0) | temp; 
1

Pour accéder aux quatre premiers bits (je suppose que vous voulez dire les quatre bits les plus élevés) de tmp (c'est-à-dire pour obtenir leurs valeurs), vous utilisez des masques binaires. Donc, si vous voulez savoir si par exemple le second bit est défini, vous effectuez les opérations suivantes:

int second_bit = (tmp & 0x4000000) >> 30;

maintenant second_bit est 1 si le bit est mis à zéro et autrement. L'idée sous-jacente est la suivante:

Imaginer tmp est (en binaire)
1101 0000 0000 0000 0000 0000 0000 0000
Maintenant, vous utilisez au niveau du bit (le &) avec la valeur suivante
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
ANDing produit un 1 sur le bit donné si et seulement si les deux opérandes ont des bits correspondants (ils sont tous les deux 1). Ainsi, le résultat sera:
0100 0000 0000 0000 0000 0000 0000 0000
Ensuite, vous passez ces 30 bits vers la droite, ce qui en fait être:
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
Notez que si la valeur d'origine avait le bit testé zéro, le résultat serait nul. De cette façon, vous pouvez tester n'importe quel bit que vous aimez, vous avez juste besoin de fournir un masque correct. Notez que j'ai supposé ici que int est de 32 bits de large, ce qui devrait être vrai dans la plupart des cas.

1

Vous devrez en savoir un peu plus sur sc_bv pour vous assurer d'obtenir les bonnes informations. Aussi, quand vous dites les "quatre premiers octets" je suppose que vous voulez dire les "quatre premiers bits". Cependant, cela est également trompeur, parce que vous voulez vraiment faire la distinction entre les bits de poids faible ou de poids fort.

Dans tous les cas, vous utilisez les opérateurs C au niveau du bit pour ce genre de chose. Cependant, vous aurez besoin de connaître la taille des valeurs entières ET la "endian-ness" de l'architecture d'exécution pour obtenir ce droit.

Mais, si vous voulez vraiment juste les quatre premiers bits, alors vous feriez quelque chose comme ça ...

inline unsigned char 
first_4_bits(void const * ptr) 
{ 
    return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4; 
} 

et qui saisira les premiers 4 bits de ce qu'il pointé du. Donc, si le premier octet pointé sur est 0x38, alors cette fonction retournera les 4 premiers bits, donc le résultat sera 3.