将bool值打包为char

Pack bool value into a char

本文关键字:char bool      更新时间:2023-10-16

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

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

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

你可以这样做:

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兼容的,并且您在char中存储ASCII范围为0-127的字符(可能通过使用字符字面量),那么您有一个额外的位可以空闲(如果CHAR_BIT == 8)。

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

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

char c = 'A';
bool b = true;
c |= (b << 7);
但是,请注意,您不能在打印出char的同时还期望看到Achar现在有不同的值