ホームページ > バックエンド開発 > C++ > 8 つのブール値と 1 バイトの間で効率的に変換するにはどうすればよいですか?

8 つのブール値と 1 バイトの間で効率的に変換するにはどうすればよいですか?

DDD
リリース: 2024-12-18 11:59:11
オリジナル
597 人が閲覧しました

How Can I Efficiently Convert Between Eight Boolean Values and a Single Byte?

バイトをブール値にマージおよびデコードする

一部のプログラミング シナリオでは、バイナリ データをビット レベルで操作する必要があります。このようなタスクの 1 つは、8 つのブール値を 1 バイトに変換したり、その逆に変換したりすることです。この記事では、この変換を実現する効率的な方法について説明します。

ブール値をバイトに変換する

ブール値をバイトにマージする最も簡単な方法は、ビット単位の演算を使用することです。各ブール値はバイト内のビット位置に対応し、「true」は「1」に、「false」は「0」に割り当てられます。ブール値に基づいて「1」を左に繰り返しシフトし、それを累積した結果と OR 演算することにより、バイトを構築できます。このプロセスは、次の関数で例示されています。

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

バイトをブール値にデコードする

逆に、バイトを個々のブール値にデコードするには、同様の反復プロセスが必要です。バイトを右にシフトし、「1」マスクと比較することで、各ビット位置を抽出し、「1」の場合は「true」、「0」の場合は「false」のブール値を割り当てることができます。次の関数は、このプロセスを実装します。

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

ビットフィールド アプローチ

代替の、潜在的により洗練されたアプローチでは、ビットフィールドと共用体を利用します。 8 つの 1 ビット フィールドを含む構造体を定義することにより、各ブール値を対応するフィールドに直接割り当てることができます。この構造を unsigned char と結合すると、2 つのデータ型間の変換が容易になります。これは、次のコード スニペットによって実現されます。

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

共用体のいずれかのメンバーに値を割り当てると、変換が自動的に実行されます。ただし、ビットフィールドの順序と潜在的なパディングは実装によって異なる可能性があることに注意することが重要です。

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

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