Maison > développement back-end > C++ > Comment puis-je fusionner et décoder efficacement huit valeurs booléennes en un seul octet ?

Comment puis-je fusionner et décoder efficacement huit valeurs booléennes en un seul octet ?

DDD
Libérer: 2024-12-31 22:28:10
original
990 Les gens l'ont consulté

How Can I Efficiently Merge and Decode Eight Boolean Values into a Single Byte?

Fusion et décodage des valeurs booléennes en octets

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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;
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal