はじめに
プログラマーは、多くの場合、ブール値をバイトで表現する必要に遭遇します。シングルバイトなどのコンパクトな形式。この記事では、ブール値をバイトにマージおよびデコードする 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 サイトの他の関連記事を参照してください。