0

我需要将一个布尔值打包成一个字节。该字节可以包含这些字符之一。

(0 到 9 和 A 到 F)即十六进制字符。

我相信这些字符本质上占用 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 内的字符存储在 a 中char(可能通过使用字符文字),那么您就有多余的位(如果CHAR_BIT == 8)。

如果您仅将十六进制字符存储为 ASCII 字符,那么您确实有额外的两位,因为您使用的是 0-63 范围内的字符。

尽管如此,如果你想在你的第 8 位存储一个布尔变量char,你可以简单地移位一个bool值,然后用你的按位或它char

char c = 'A';
bool b = true;
c |= (b << 7);

但是请注意,您不能打印出来char并期望仍然看到A. 现在char有不同的价值。

于 2013-03-28T15:10:01.030 回答