我需要将bool值打包到一个字节中。该字节可以包含其中一个字符。
(0到9和A到F),即十六进制字符。
我相信这些字符本质上是7位,所以我们如何利用第8位存储bool值并在稍后阶段检索它们?
答案 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);
,并且仍希望看到char
。 A
现在有不同的值。