J'ai regardé très rapidement si la source n'existait pas et je ne l'ai pas trouvé.
Je précise que c'est une astuce que je viens d'apprendre en cours.
En utilisant "Les champs de bits" et une union, nous pouvons très simplement obtenir l'état des bits qui composent un octet... mais pourquoi pas un int en modifiant un peu le code.
Les champs de bits :
Pour se qui ne connaisse pas, ils permettent de limiter la place occupé en mémoire d'une variable si tous ces bits ne sont pas utilisés.
Pour représenter cela il suffit de mettre après le nom de la variable :nombre_bit
Par exemple, int état:1; //ici l'int ne fera pas 32bits mais qu'un seul, les valeurs max et min de etat seront donc -1 ou 0
union
A la différence d'un struct, les éléments contenus dans une union sont contenu au même emplacement mémoire
(La structure les met à la suite dans la mémoire)
Je me doute que se n'ai pas très clair un exemple:
struct _test{
int a;
unsigned char b;
}
Ici la structure occupera 5octets en mémoire (sizeof(int)=4octets et sizeof(char)=1octet)
union _test2{
int a;
unsigned char b;
}test2;
Ici sizeof(test2)=4octet
si
test2.a=0xFDE8; //valeur prise au hasard
Alors
b=0xE8;
Schéma de la mémoire:
structure union
|-----------| |-----------|
| | | |
| a | | a et b |
| | | |
|-----------| |-----------|
| b |
|-----------|
J’espère que c'est clair.
Revenons au but...créer une union entre un caractère et une structure et lire la structure pour avoir l'état des bits, regardez le code.
Les champs de bits ne sont pas toujours obligatoires.
Autre utilisation de l'union :
#include <stdio.h>
union _ip{
unsigned char membres[4]; //Les 4 membres qui compose une adresse IP
unsigned int adIp; //L'adresse IP au complet
}ip;
main()
{
printf("saisir une adresse ip en hexa :");
scanf("%x",&ip.adIp); //Saisie en hexa de l'adresse ip au complet
printf("l'adresse ip est : %03d.%03d.%03d.%03d\n"
,ip.membres[3],ip.membres[2],ip.membres[1],ip.membres[0]); //Attention a l'ordre,il est inversé
}