将bool值打包为char
Pack bool value into a char
我需要将一个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
的同时还期望看到A
。char
现在有不同的值