一部のプログラミング シナリオでは、バイナリ データをビット レベルで操作する必要があります。このようなタスクの 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 サイトの他の関連記事を参照してください。