0

ブール値をバイトにパックする必要があります。バイトには、これらの文字のいずれかを含めることができます。

(0 から 9 および A から F) つまり、16 進文字。

これらの文字は基本的に7ビットを使用していると思いますが、8番目のビットを使用してブール値を保存し、後の段階で両方を取得するにはどうすればよいでしょうか?

4

2 に答える 2

2

あなたはこれを行うことができます:

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);
于 2013-03-28T15:12:42.333 に答える
0

使用しているビット数は、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現在、異なる値を持っています。

于 2013-03-28T15:10:01.030 に答える