ブール値をバイトにパックする必要があります。バイトには、これらの文字のいずれかを含めることができます。
(0 から 9 および A から F) つまり、16 進文字。
これらの文字は基本的に7ビットを使用していると思いますが、8番目のビットを使用してブール値を保存し、後の段階で両方を取得するにはどうすればよいでしょうか?
ブール値をバイトにパックする必要があります。バイトには、これらの文字のいずれかを含めることができます。
(0 から 9 および A から F) つまり、16 進文字。
これらの文字は基本的に7ビットを使用していると思いますが、8番目のビットを使用してブール値を保存し、後の段階で両方を取得するにはどうすればよいでしょうか?
あなたはこれを行うことができます:
char pack(char c, bool b) {
char res = c;
if (b) {
res |= 128;
}
return res;
}
void unpack(char packed, char &c, bool &b) {
b = ((packed & 128) > 0);
c = packed & 127;
}
パックされた値の一部だけを簡単に操作できるようにするために、次のような関数を追加することもできます。
char unpackChar(char packed) {
return packed & 127;
}
bool unpackBool(char packed) {
return ((packed & 128) > 0);
}
それらを追加する場合は、unpack()
情報を重複させないように再定義します。
void unpack(char packed, char &c, bool &b) {
c = unpackChar(packed);
b = unpackBool(packed);
}
使用例:
char packed = pack('A', true);
std::cout << unpackChar(packed);
使用しているビット数は、char
使用方法によって異なります。コンパイラの実行文字セットが ASCII 互換であり、ASCII 範囲 0 ~ 127 内の文字をchar
(おそらく文字リテラルを使用して) に格納している場合は、予備のビットがあります (if の場合CHAR_BIT == 8
)。
16 進文字のみを ASCII 文字として格納している場合は、0 ~ 63 の範囲内の文字を使用しているため、実際には余分な 2 ビットがあります。
それにもかかわらず、ブール変数を の 8 番目のビットに格納したい場合は、char
単にbool
値をビット シフトしてから、ビットごとに OR で を使用できますchar
。
char c = 'A';
bool b = true;
c |= (b << 7);
ただし、これを印刷しchar
てもまだ表示されるとは期待できないことに注意してくださいA
。はchar
現在、異なる値を持っています。