Bonjour,
Est ce quelqu'un a une idée de comment déclarer et manipuler une variable qui est sur un seul bit.
Je vous remercie d'avance.
Bonjour,
Est ce quelqu'un a une idée de comment déclarer et manipuler une variable qui est sur un seul bit.
Je vous remercie d'avance.
Rien de standard. Ce que tu peux faire, c'est utiliser les opérateurs de bit et traiter un char, int, ou c'que tu veux comme un ensemble de bit dont la valeur en tant qu'ensemble ne veut rien dire.
Tu peux par exemple considérer que char c'est 8 variables de 1 bit, ou que short c'est 16 variables de 1 bit, etc...
Après, tu peux utiliser les opérateurs <<, & et | pour récupérer leur contenu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> void set_bit( int* bitset32, char bit ) { *bitset32 |= ( 1 << bit ); } bool is_set( int* bitset32, char bit ) { return *bitset32 & ( 1 << bit ); } void unset_bit( int* bitset32, char bit ) { if( is_set( bitset32, bit ) ) *bitset32 -= ( 1 << bit ); } int main() { int bitset = 0; set_bit( &bitset, 0 ); printf("%d\n", is_set( &bitset, 0 ) ); printf("%d\n", is_set( &bitset, 1 ) ); unset_bit( &bitset, 0 ); printf("%d\n", is_set( &bitset, 0 ) ); return 0; }
ou bien manipuler un champ de bit dans une structure
exemple unsigned 32 ou chaque bit est accessible, ensuite il faut faire des manipulations comme celle indiqué par julien du sud:
quelques informations complémentaires ici
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36 struct bytefield32 { unsigned bt0:1; unsigned bt1:1; unsigned bt2:1; unsigned bt3:1; unsigned bt4:1; unsigned bt5:1; unsigned bt6:1; unsigned bt7:1; unsigned bt8:1; unsigned bt9:1; unsigned bt10:1; unsigned bt11:1; unsigned bt12:1; unsigned bt13:1; unsigned bt14:1; unsigned bt15:1; unsigned bt16:1; unsigned bt17:1; unsigned bt18:1; unsigned bt19:1; unsigned bt20:1; unsigned bt21:1; unsigned bt22:1; unsigned bt23:1; unsigned bt24:1; unsigned bt25:1; unsigned bt26:1; unsigned bt27:1; unsigned bt28:1; unsigned bt29:1; unsigned bt30:1; unsigned bt31:1; };
http://www.technoplaza.net/programming/lesson8.php
http://msdn.microsoft.com/en-us/libr...xh(VS.80).aspx
http://stackoverflow.com/questions/1...ipulation-in-c
http://www.pagetable.com/?p=250
bazar: http://www.improetcompagnie.com/publ...ctacles-6.html
BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil
Emacs Wiki: http://www.emacswiki.org/
En attente de ce que produira: http://www.pushmid.com
Attention cependant pour le retour de la fonction is_set, le type bool n'existe qu'en C99 sinon, il faut le remplacer par un type int
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Attention, un char ne fait pas toujours 8 bits. Pour savoir ce qu'il en est en pratique, il faut consulter la constante CHAR_BIT définie dans <limits.h>Tu peux par exemple considérer que char c'est 8 variables de 1 bit, ou que short c'est 16 variables de 1 bit, etc...
Non effectivement un char ne fait pas toujours exactement 8 bits mais il fait obligatoirement au moins 8 bits.
N'utiliser que 8 bits (et utiliser explicitement des unsigned char et non des char) permet donc d'être portable au prix d'un petit "gaspillage" de mémoire sur les rares plateformes où un char représente plus de 8 bits.
Dans le cas présent, il n'est pas question de structure.
En outre, mis à part quelques cas assez spécifiques pour lesquels la portabilité n'est généralement pas la préoccupation première, l'alignement dans les structures ne nuit pas réellement à la portabilité.
A moins bien sur d'utiliser des constructions discutables [1] (comme mapper directement une structure dans un flux ou dans un fichier) mais dans ce cas le problème n'est pas dans la perte de l'alignement mais dans la supposition erronée que la représentation serait la même partout.
[1] Ce qui, au passage, ne signifie pas que le code soit mauvais. Parfois la portabilité n'est pas un critère attendu et de telles constructions peuvent avoir du sens. Il faut juste être conscient des limitations.
Non, ce n'est pas ce que j'ai voulu dire.
Ce que je disais c'est que:
- Se restreindre à la plage minimale garantie (et donc à la taille minimale) est portable.
- L'alignement dans une structure n'a globalement, moyennant un minimum de travail et d'attention, pas d'impact sur la portabilité.
Cependant, concernant le cas particulier de l'alignement des structures:
- Parfois, pour différentes raisons, on ne cherche pas à faire dans le portable, bien que cela reste possible.
- Enfin, il existe quelque cas extrêmes où il n'est tout simplement pas possible de faire portable.
Bonjour,
Je remercie tous de vos réponse et de cette discusion enrichissante. Je vois plus claire maintenant.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager