Maison >développement back-end >C++ >Comment les valeurs booléennes peuvent-elles être codées et décodées efficacement en octets ?

Comment les valeurs booléennes peuvent-elles être codées et décodées efficacement en octets ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-11 08:23:10568parcourir

How Can Boolean Values Be Efficiently Encoded and Decoded into Bytes?

Le décodage et l'encodage des valeurs booléennes dans et hors des octets

Le décodage et l'encodage des valeurs booléennes dans et hors des octets peuvent être réalisés par diverses méthodes. Cet article explorera deux approches :

Hard Way :

En utilisant une approche de manipulation directe des bits, les fonctions suivantes sont utilisées :

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;
}

void FromByte(unsigned char c, bool b[8]) {
    for (int i = 0; i < 8; ++i) {
        b[i] = (c & (1 << i)) != 0;
    }
}

Dans cette méthode, chaque valeur booléenne est représentée par un bit, un octet (8 bits) pouvant contenir 8 valeurs booléennes. valeurs.

Cool Way :

Une approche alternative exploite les champs de bits au sein d'une structure et d'une union pour fournir une manipulation flexible des données :

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;
};

Ici , la structure Bits contient 8 valeurs booléennes sous forme de champs de bits. L'union CBits partage le même espace mémoire, permettant l'accès aux valeurs booléennes via le membre bits ou à la valeur octet via le membre byte.

Notes d'implémentation :

  • L'ordre et le remplissage des champs de bits sont définis par l'implémentation.
  • La lecture d'un membre du syndicat après avoir écrit à un autre est bien définie en C99 et certaines implémentations C (y compris MSVC et GCC), mais il s'agit d'un comportement non défini en C standard.
  • Pour le C portable, pensez à utiliser memcpy ou std::bit_cast de C 20 pour la diffusion de jeux de mots.

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!

Déclaration:
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