bonjour,je veux créer un tableau de bits de taille maximale égale à 32 .comment faire exactement??:?
Version imprimable
bonjour,je veux créer un tableau de bits de taille maximale égale à 32 .comment faire exactement??:?
Tu ne peux pas en C, faire directement un "tableau" de "bits", car les bits ne sont pas individuellement adressables.
Par contre, tu peux faire un tableau de char de CHAR_BIT (défini dans <limits.h> il me semble, ne peut pas être inférieur à huit) bits chacun...
merci pour la reponse mais j'ai besoin de 32 bits non pas de 8.et je veux savoir comment faire pour transformer un ensemble d'identifiants {1,3,6,9} par exemple en un tableau de bits 01010010010 par exemple
Bonjour,
Je suis curieux de savoir pourquoi tu as besoin de ça? N'y a-t-il vraiment aucune autre solution?
La plus petite taille de variable en C, c'est le type char ( 1 octet, soit 8 bits ).
Mais via un char tu peux connaître indirectement la valeur de chaque bit.
Utilise un uint32_t, avec opérations binaires (décalage de bits, et binaire, ou binaire...) pour accéder aux différents bits.
comment pourrai-je déclarer une variable de 4 octets comme ça j'aurais mes 32 bits?? et comment faire pour modifier la valeur des bits??
Variable de 4 octets : int.
Quoique théoriquement c'est pas certain. Donc tu peux vérifier avec :
Si cela t'affiche 4, c'est bon.Code:printf( "%d", sizeof(int) );
Pour modifier la valeur des bits, je ne saurais pas te donner une méthode direct, mais tu peux en trouver tout un tas indirect ( les opérateurs par exemple ).
Explicite nous ton but, sinon je crains que cela soit dur de te renseigner mieux.
Crée ton tableau de type "unsigned long int" qui est codée sur 32 bits.
Ensuite, pour stocker chacuns de tes 4 octets, il faut que tu joues avec les opérateurs bits à bts, même chose pour accéder à chaque bits.
Exemple pour accéder au 2ème octet de ta variable:
tu remarqueras à la sortie que container sera égal à 0xFFAAFFFFCode:
1
2
3
4
5
6
7
8
9 unsigned byte_index = 1; unsinged container = 0xFFFFFFFF; byte_index = (3 - (byte_index % 4)) << 3; byte_mask = ~(0x000000FF << byte_index); byte_value = 0xAA << byte_index; container = (container & byte_mask) | byte_value;
uint32_t fait toujours 32 bits. Un int ne fait pas forcément 32 bits. Un long "encore moins" sur les architectures courantes.
tu sais comment est déclaré uin32_t??
http://linux.die.net/man/3/uint32_t
Ces déclarations sont faites après vérification de la taille, si uint32_t est déclaré comme étant un alias du type unsigned long int ou autre, c'est que sur cette architecture un unsigned long int fait 32 bits.
La seule façon portable de déclarer un entier non signé sur 32 bit est d'utiliser uint32_t. Bien que ce soit un type optionnel d'après la norme. Donc il se peut qu'il ne soit pas défini sur toutes les architectures.
Un autre moyen plus simple/portable est de déclarer un tableau de 4 char, à condition de vérifier que la macro CHAR_BIT (définie dans limits.h) vaut 8; ainsi on est sûr qu'un char fait 8 bits. Mais dans ce cas il faut faire un traitement autre que des simples >> et << et des masques sur 32 bits; il faut traiter le tableau comme tel, et faire attention au problèmes de codage des entiers de plus d'un byte (l'endianness en l'occurrence) qui ne se posent que si on manipule les bits en dur par l'intermédiaire d'un tableau de bytes. Si un char n'est pas sur 8 bits (c'est peu probable mais sait-on jamais) alors il faut chercher un autre type, notamment uint8_t ou 16 ou 32.
re,
merci pour vos reponses!!
je suis un peu perdu là,j'utilise uint_32 ou la methode donnée par ggwtf??
Utilise uint32_t si ta plate-forme est le supporte (gcc le supporte, Visual Studio non).
uint32_t est déclaré dans <stdint.h>.
re,
j'ai ecrit cela unsigned int i = 0 | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 10);
qu'est ce que je dois ajouter pour afficher le code binaire resultat??
Tu veux dire pour afficher le nombre en notation binaire? cherche sur le forum, la question a été posée il y a moins d'un mois (c'est plus difficile qu'afficher en hexa, car ça n'est pas supporté directement par un simple printf()).
euuh normalment le code que j'ai posté met les valeurs des bits 1,5,8et10 à 1 non?je veux maintenant afficher le resultat
re,
j'ai trouvé la fonction get_binairy mais ça n'indique pas comment l'utiliser??8O
C'était dur, hein ?Code:
1
2
3
4
5
6
7
8
9
10
11 #include <stdint.h> #include <stdio.h> void print_uint32(uint32_t bits) { uint32_t mask; for (mask = 1<<31; mask; mask >>= 1) { fputc(bits & mask ? '1' : '0', stdout); } }
merciii
le programme écrit donne cela:
mais ça ne marche pas!!:cry:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdint.h> #include <stdio.h> int main(){ unsigned int i = 0 | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 10); void print_uint32(uint32_t bits) { uint32_t mask; for (mask = 1<<31; mask; mask >>= 1) { fputc(bits & mask ? '1' : '0', stdout); } } }
Mon dieu 8O
En C on ne peut pas définir une fonction dans une fonction.
re,ouii j'ai posté la version non corrigée:oops:
j'ai réecrit le code d'une autre manière mais ça ne marche pas aussi
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdint.h> #include <stdio.h> void affichebin(unsigned n) { unsigned bit = 0 ; unsigned mask = 1 ; for (int i = 0 ; i < 32 ; ++i) { bit = (n & mask) >> i ; ::printf("%d", bit) ; mask <<= 1 ; } } int main(){ unsigned int i = 0 | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 10); affichebin(unsigned n); }
L'opérateur de résolution de portée n'existe pas en C. :aie:Code:::printf("%d", bit) ;
As-tu appris les bases du C ? :lol:
re,
cette fonction est utilisé dans un sujet sur ce forum et elle marche
vous pouvez verifier dans le sujet "comment afficher un nombre en binaire avec printf ?"
et en compilant j'ai l'erreur suivante:error: expected primary-expression before "unsigned"|
Non, elle ne marche pas en C. Les opérateurs de résolution de portée n'existent pas en C, cela provoque donc forcément une erreur.
Si cela marche chez vous, c'est que vous compilez du code C avec un compilateur C++. Chose à ne pas faire. Le C n'est pas du C++ et le C++ n'est pas du C. ;)
C'est tout vérifié :
:roll:Citation:
exemple.c: In function `affichebin':
exemple.c:12: error: syntax error before ':' token
re,
8O8O
alors comment pourrai-je corriger cette fonction?
re,
merci infiniment pour la reponse mais maintenant j'ai une autre question à vous poser:
si je veux que les bits qui prennent 1 soit choisis par l'utilisateur comment pourrai-je modifier unsigned int pour satisfaire cette condition?dois-je poser une variable x qui prendra chaque valeur entrée par l'utilisateur??
Il suffit de demander à l'utilisateur quel bit n doit être mis à 1 (0<=n<=31) et de faire
Code:
1
2
3
4
5
6
7
8 unsigned int i = 0; int n; .... // demander une valeur pour n et tester si elle est valide .... // mettre le bit n à 1 i |= 1<<n; // ou i = i | 1<<n // recommencer si on veut en mettre plusieurs à 1
re,
je vous remercie,j'ai essayé cette methode mais il me saisie juste l'ensemble(je veux mettre plusieurs variable à 1)
voici mon code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() {int a,k,j,z; int t[100]; unsigned int i = 0; unsigned int n; printf("veuillez entrer l'ensemble d'identifiant a chercher\n\n"); printf("donner le nbr d'element de l'ensemble"); scanf("%d",&z); for (k=0;k<z;) {printf("donner un element"); scanf("%d",&t[k]); if(t[k]<31) k++; } j=0; while (j<z) { n = t[j]; i |= (1 << n); j++; } system("pause"); }
1- Soigne l'indentation de ton code. C'est important pour sa clarté.
2- Si tu veux voir le résultat, il faut demander son affichage : affichebin(i);
ouups j'ai oublié l'affiche bin :oops::oops:
merci infiniment !!!:ccool::ccool:
une autre question svp:D
je voudrais verifier si la valeur entrée par l'utilisateur dans le tableau existe déja .pour cela j'ai ecrit une fonction,il n'ya pas d'erreur de syntaxe mais ça ne fonctionne pas voici la fonction:
et en programme principale je l'ai appelé de cette façon :Code:
1
2
3
4
5
6
7
8 int egal(int i,int j,int t[i][j]) {int h; for(h=0;h<j;h++) { if(t[i][h]==t[i][j]) return(0); } return(1); }
if(egal(i,j,t))
instruction
Qu'est-ce qui ne fonctionne pas ? Qu'est-ce qui se passe d'anormal ? A première vue ce n'est pas la fonction elle-même.
Montre la partie où est défini t et où la fonction est appelée.
Code:
1
2
3
4
5
6
7
8 for (j=0;j<z;) {printf("donner un element"); scanf("%d",&t[i][j]); c= t[i][j]; if((t[i][j]<32)||((egal(i,j,c)))) j++; } }
Ce ne peut pas être ce code, le compilateur ne l'accepterait pas : dans l'appel c est un int et la fonction attend un tableau.
8O
alors comment je peux le corriger??
c'est bon j'ai trouvé merciiiii:ccool::ccool: