ホームページ > バックエンド開発 > C++ > 8 つのブール値を単一バイトに効率的にマージしてデコードするにはどうすればよいですか?

8 つのブール値を単一バイトに効率的にマージしてデコードするにはどうすればよいですか?

DDD
リリース: 2024-12-31 22:28:10
オリジナル
989 人が閲覧しました

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

ブール値をバイトにマージしてデコードする

はじめに

プログラマーは、多くの場合、ブール値をバイトで表現する必要に遭遇します。シングルバイトなどのコンパクトな形式。この記事では、ブール値をバイトにマージおよびデコードする 2 つの方法について説明します。

ブール値のマージ

8 つのブール値を 1 バイトにマージするには、次のアプローチ:

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;
}
ログイン後にコピー

このコードはブール値を反復処理します。

バイトのデコード

バイトを 8 つの個別のブール値にデコードするには、次の関数を使用できます。

void FromByte(unsigned char c, bool b[8])
{
    for (int i = 0; i < 8; i++)
        b[i] = (c & (1 << i)) != 0;
}
ログイン後にコピー

この関数はバイト内のビットを反復処理し、各ビットが設定されているかどうかを確認して割り当てます。対応するブール値。

クールな代替案: Union

あるいは、ブール値とバイトの両方を表すために共用体を使用することもできます:

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;
};
ログイン後にコピー

共用体の一方のメンバーに書き込み、もう一方のメンバーから読み取ることで、ブール値を効率的にマージおよびデコードできます。ただし、Bits 構造体のビットの順序は実装で定義されることに注意することが重要です。

実装ノート

A の 1 つのメンバーを読み取ることは重要であることに注意してください。他のものに書き込んだ後の結合は、ISO C99 および主要な C コンパイラの拡張機能として明確に定義されています。ただし、これは ISO C では未定義の動作です。移植性を確保するには、C での型パニングに memcpy または C 20 std::bit_cast を使用することをお勧めします。

以上が8 つのブール値を単一バイトに効率的にマージしてデコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート