将bool值打包成char

时间:2013-03-28 15:05:24

标签: c++ visual-studio-2010

我需要将bool值打包到一个字节中。该字节可以包含其中一个字符。

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

我相信这些字符本质上是7位,所以我们如何利用第8位存储bool值并在稍后阶段检索它们?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

char正在使用的位数完全取决于您使用它的方式。如果编译器的执行字符集与ASCII兼容,并且您在char中存储了0-127范围内的字符(可能通过使用字符文字),那么您需要额外的一点(如果{{ 1}})。

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

尽管如此,如果要在CHAR_BIT == 8的第8位存储布尔变量,只需将char值移位,然后将其与bool按位或运算:

char

但请注意,您无法打印此char c = 'A'; bool b = true; c |= (b << 7); ,并且仍希望看到charA现在有不同的值。