我需要将一个布尔值打包成一个字节。该字节可以包含这些字符之一。
(0 到 9 和 A 到 F)即十六进制字符。
我相信这些字符本质上占用 7 位,那么我们如何利用第 8 位来存储布尔值并在稍后阶段检索两者?
我需要将一个布尔值打包成一个字节。该字节可以包含这些字符之一。
(0 到 9 和 A 到 F)即十六进制字符。
我相信这些字符本质上占用 7 位,那么我们如何利用第 8 位来存储布尔值并在稍后阶段检索两者?
你可以这样做:
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 兼容的,并且您将 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
有不同的价值。