Type binaire de taille quelconque

Type binaire de taille quelconque - C++ - Programmation

Marsh Posté le 30-01-2003 à 14:24:22    

Je suis en train de faire un simulateur de SIMD avec un processeur de controle et plusieurs processeurs d'execution et il faudrait que j'ai un registre de masque contenant autant de bits que de processeurs d'execution (ca peut varier de 8 a beaucoup +, genre 1024 ou 2048). et je n'arrive pas a trouver une solution facilement implementable. les operations principales sont des initialisations en brut (genre tous les bits a 0) et des copies entre ces structures. Mais l'implementation des et/ou/non/ouex devrait etre facile a coder.
 
Merci  [:huit]

Reply

Marsh Posté le 30-01-2003 à 14:24:22   

Reply

Marsh Posté le 30-01-2003 à 15:32:52    

T'as regardé du côté des champ de bits?

Reply

Marsh Posté le 30-01-2003 à 15:39:13    

LetoII a écrit :

T'as regardé du côté des champ de bits?


 
j'aurai bien aimé faire une structure comme ca :
 

Code :
  1. struct reg
  2. {
  3.   int champs[NB_BITS] : 1 ;
  4. };


 
mais gcc est pas d'accord  [:proy]  
 

Reply

Marsh Posté le 30-01-2003 à 18:01:43    

xav14 a écrit :

Je suis en train de faire un simulateur de SIMD avec un processeur de controle et plusieurs processeurs d'execution et il faudrait que j'ai un registre de masque contenant autant de bits que de processeurs d'execution (ca peut varier de 8 a beaucoup +, genre 1024 ou 2048). et je n'arrive pas a trouver une solution facilement implementable. les operations principales sont des initialisations en brut (genre tous les bits a 0) et des copies entre ces structures. Mais l'implementation des et/ou/non/ouex devrait etre facile a coder.
 
Merci  [:huit]  


si t'es en C++ tu peux regarder du coté des Bitset.

Reply

Marsh Posté le 31-01-2003 à 04:16:26    

En C++:

Code :
  1. #include <bitset>
  2. using namespace std;
  3. bitset<1024> bs; //[], <<, set, reset, tout y est.


 
En C:

Code :
  1. #include <limits.h>
  2. #define NBITS 1024 //nombre de bits utiles
  3. //petits raccourçis
  4. #define DIVUP(a,b) ( (a)/(b) + ((a)%(b)>0 ? 1 : 0) )
  5. #define INT_BIT (CHAR_BIT*sizeof(int))
  6. #define NINTS DIVUP(NBITS,INT_BIT) //nombre d'ints nécessaires pour stocker NBITS bits
  7. #define IPOS(pos) pos/INT_BIT //n° d'entier stockant ce bit
  8. #define BPOS(pos) pos%INT_BIT //n° du bit dans cet entier
  9. //structure d'abstraction
  10. struct bits{
  11. int ai_[NINTS]; //tableau dans une structure: copie possible
  12. };
  13. typedef struct bits bits;
  14. //opérations sur tous les bits
  15. void bits_set(bits* pb){ int i; for(i= 0 ; i<NINTS ; ++i) pb->ai_[i]=         ~0 ;}//tout à 1
  16. void bits_clr(bits* pb){ int i; for(i= 0 ; i<NINTS ; ++i) pb->ai_[i]=          0 ;}//tout à 0
  17. void bits_not(bits* pb){ int i; for(i= 0 ; i<NINTS ; ++i) pb->ai_[i]= ~pb->ai_[i];}//tout inversé
  18. //opérations sur le n-ième bit
  19. void bits_setat(bits* pb, int n){ pb->ai_[IPOS(n)]|=   1<<BPOS(n) ;}
  20. void bits_clrat(bits* pb, int n){ pb->ai_[IPOS(n)]&= ~(1<<BPOS(n));}
  21. void bits_notat(bits* pb, int n){ pb->ai_[IPOS(n)]^=   1<<BPOS(n) ;}
  22. //lecture
  23. int  bits_read (bits* pb, int n){
  24. return (pb->ai_[IPOS(n)] & 1<<BPOS(n))>>BPOS(n) ; //>>BPOS(n) optionnel, met le bit en pos 0
  25. }
  26. //écriture
  27. void bits_write(bits* pb, int n, int val){
  28. if(val) bits_setat(pb, n);
  29. else    bits_clrat(pb, n);
  30. }

:sweat:
 
Utilisation:

Code :
  1. int main(void){
  2. bits b1, b2;
  3. bits_set(&b1);
  4. bits_clr(&b1);
  5. bits_not(&b1);
  6. bits_clrat(&b1, 36);
  7. bits_setat(&b1, 36);
  8. bits_notat(&b1, 36);
  9. b2= b1;
  10. return 0;
  11. }


 
Ou alors bien bourrin: 1 char par bit :lol:.


Message édité par Musaran le 31-01-2003 à 04:17:45

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 02-02-2003 à 13:48:44    


 
La solution c++ est bien courte  :D mais j'essaye de le faire en ansi C + posix.
 
La solution C est bien minimale comme j'aime (a part la macro instruction  :whistle: ) je vais la recuperer en y mettant ma sauce  :D  
 
merci  [:huit]

Reply

Marsh Posté le 02-02-2003 à 14:01:17    

attention: bitset n'est peut etre pas approprié du fait qu'il est un pseudo container, il peut y avoir des limitations. bien qu'un bitset soit de taille fixe et donc certainement plus rapide, il ne faut pas non plus éliminer d'office std::vector<bool> qui est souvent spécialisé (gain de place) et propose l'interface d'un vector.
 
Musaran > je croyais que tu arretais les macros cette année? quid des fonctions inline en C99?

Reply

Marsh Posté le 02-02-2003 à 16:33:32    

++Taz a écrit :

attention: bitset n'est peut etre pas approprié du fait qu'il est un pseudo container, il peut y avoir des limitations. bien qu'un bitset soit de taille fixe et donc certainement plus rapide, il ne faut pas non plus éliminer d'office std::vector<bool> qui est souvent spécialisé (gain de place) et propose l'interface d'un vector.
Musaran > je croyais que tu arretais les macros cette année? quid des fonctions inline en C99?


 
arf steu chinois :/
 
d'ailleurs, ptite question en passant, ya une norme pour le C++ ??

Reply

Marsh Posté le 02-02-2003 à 16:34:58    

iso
 
edit: tu comprends pas quoi?


Message édité par Taz le 02-02-2003 à 16:36:30
Reply

Marsh Posté le 02-02-2003 à 16:48:06    

++Taz a écrit :

iso
 
edit: tu comprends pas quoi?


 
attention: bitset n'est peut etre pas approprié du fait qu'il est un pseudo container, il peut y avoir des limitations. bien qu'un bitset soit de taille fixe et donc certainement plus rapide, il ne faut pas non plus éliminer d'office std::vector<bool> qui est souvent spécialisé (gain de place) et propose l'interface d'un vector.
 
mais bon, j'ai jamais fais de C++ non plus  [:twixy]  
 
 

Reply

Marsh Posté le 02-02-2003 à 16:48:06   

Reply

Marsh Posté le 02-02-2003 à 16:56:26    

pseudo container: std::vector, std::list, etc, sont des conteneurs (collection ou ~container), c'est à dire qu'ils fournissent des iterator, sont des sequences modifiables de taille variable et sont des template de type, etc std::bitset (tout comme std::string) ne reponds pas à ces criteres (taille fixe, pas d'iterateurs, etc)
 
std::vector<bool> ben un vecteur de booléens, c'est une interprétation d'une sequence de bits
 
interfacevoir conteneur: ils fournissent les meme methodes et fonctonnalités qui permettent de manipuler un conteneur stl de la meme manière sans se soucier de son type (ex: la fonction membre push_back, ou begin())
 
vector voir plus haut
 
 
c'est vrai que t'y connais rien.... :sarcastic:


Message édité par Taz le 02-02-2003 à 16:57:12
Reply

Marsh Posté le 02-02-2003 à 16:58:41    

xav14 a écrit :


 
attention: bitset n'est peut etre pas approprié du fait qu'il est un pseudo container, il peut y avoir des limitations. bien qu'un bitset soit de taille fixe et donc certainement plus rapide, il ne faut pas non plus éliminer d'office std::vector<bool> qui est souvent spécialisé (gain de place) et propose l'interface d'un vector.
 
mais bon, j'ai jamais fais de C++ non plus  [:twixy]  
 
 
 


 
les pseudo conteneur (tableaux intégrés, bitset, valarray et bitset) contiennent des elts, donc ce sont des conteneurs. Mais ils n'ont pas certaines fonctionnalités qui font que tu ne peux pas les interchanger avec d'autres, alors que si tu utilises un vector, une list, un map, tu l'utilises de la même manière.
 
le std::vector<bool> est souvent une classe spécialisée pour l'optimisation (notamment au niveau mémoire et accés)
 
elle propose l'interface d'un vector: tu l'utilises exactement comme un vector normal
 
oups grillé  :D


Message édité par gloop le 02-02-2003 à 16:59:19
Reply

Marsh Posté le 02-02-2003 à 17:23:33    

++Taz a écrit :


c'est vrai que t'y connais rien.... :sarcastic:


 
j'ai jamais dit le contraire   :heink:
 
et pis la poo j'accroche pas du tout   [:proy]  
 
je me suis tapé du java pendant 2 semestres et j'accroche pas  
 
je prefere ada ou c  [:isa]


Message édité par xav14 le 02-02-2003 à 17:24:59
Reply

Marsh Posté le 03-02-2003 à 09:38:09    

xav14 a écrit :

La solution c++ est bien courte  :D

Comme souvent.
Mais le source de <bitset> est bien touffu.
 

++Taz a écrit :

il ne faut pas non plus éliminer d'office std::vector<bool> qui est souvent spécialisé (gain de place) et propose l'interface d'un vector.

C'est effectivement permis par la norme C++98, et c'est reconnu comme une grosse bourde.
Ça fait foirer plein de mécanismes génériques, au point qu'on a cherché un moyen de "désactiver" cette spécialisation.
 

Citation :

Musaran > je croyais que tu arretais les macros cette année? quid des fonctions inline en C99?

Je peux pas... j'ai besoin de NINT en constante de compilation pure pour dimensionner le tableau.
Il y a clairement une lacune à C et C++ à ce niveau.
 
 
Il me semble qu'il y a une astuce plus simple pour la division entière arrondie vers le haut (DIVUP), mais je retrouves pas.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed