Introduction
Souvent, les programmeurs rencontrent le besoin de représenter des valeurs booléennes dans un forme compacte, telle qu'un seul octet. Cet article explore deux approches pour fusionner et décoder des valeurs booléennes vers et depuis des octets.
Fusion de valeurs booléennes
Pour fusionner huit valeurs booléennes en un octet, on peut utiliser le approche suivante :
unsigned char ToByte(bool b[8]) { unsigned char c = 0; for (int i = 0; i < 8; i++) if (b[i]) c |= 1 << i; return c; }
Ce code parcourt les valeurs booléennes, définissant les bits correspondants dans l'octet en utilisant des opérations OU au niveau du bit.
Décodage des octets
Pour décoder un octet en huit valeurs booléennes distinctes, on peut utiliser cette fonction :
void FromByte(unsigned char c, bool b[8]) { for (int i = 0; i < 8; i++) b[i] = (c & (1 << i)) != 0; }
Cette fonction parcourt les bits de l'octet, vérifiant si chaque bit est défini et attribuant le booléen correspondant. valeur.
Alternative sympa : Union
Alternativement, on peut utiliser une union pour représenter à la fois des valeurs booléennes et un octet :
struct Bits { unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; }; union CBits { Bits bits; unsigned char byte; };
Par en écrivant à un membre du syndicat et en lisant à partir de l'autre, on peut fusionner et décoder efficacement les valeurs booléennes. Cependant, il est important de noter que l'ordre des bits dans la structure Bits est défini par l'implémentation.
Notes d'implémentation
Il est crucial de noter que la lecture d'un membre d'un l'union après avoir écrit sur un autre est bien définie dans ISO C99 et comme extension dans les principaux compilateurs C. Cependant, il s'agit d'un comportement non défini en ISO C . Pour garantir la portabilité, il est recommandé d'utiliser memcpy ou C 20 std::bit_cast pour le type-punning en C .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!