【问题标题】:Pack bool value into a char将 bool 值打包成 char
【发布时间】:2013-03-28 15:05:24
【问题描述】:

我需要将一个布尔值打包成一个字节。字节可以包含这些字符之一。

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

我相信这些字符基本上占用 7 位,那么我们如何利用第 8 位来存储布尔值并在稍后阶段检索两者?

【问题讨论】:

  • 7 位?对我来说看起来像 4 位。
  • 也许你可以使用uint8_t
  • 这样做的目的是什么?我之所以这样问,是因为对于一个典型的应用程序,很少需要如此高效的存储(而不是说,std::pair<bool, char>),这样做会使您的代码更难阅读,在某些情况下执行更慢。

标签: c++ visual-studio-2010


【解决方案1】:

你可以这样做:

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 c = 'F' 且 bool = true,则打包后我得到 res = '╞'(198)。如果我可以有 res = (0 to 9 and A to F) 有什么办法吗?
  • @PrinceSherdil 嗯,什么? res 的值是原始 cb 的某种打包组合。当然它不再等于c。如果您想找回原来的c,请使用unpack()
  • 是的,我知道。但我要说的是,如果我们可以进一步操纵这个字节,使生成的 char 在 0 到 9 和 A 到 F 之间,有什么方法吗?
  • @PrinceSherdil 我已经扩展了答案。
【解决方案2】:

char 使用的位数完全取决于您使用它的方式。如果您的编译器的执行字符集是 ASCII 兼容的,并且您将 ASCII 范围 0-127 内的字符存储在 char 中(可能通过使用字符文字),那么您有多余的位(如果 CHAR_BIT == 8) .

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

不过,如果您想在 char 的第 8 位存储一个布尔变量,您可以简单地将 bool 值移位,然后将其与您的 char 进行位或运算:

char c = 'A';
bool b = true;
c |= (b << 7);

但是请注意,您无法打印出此char 并希望仍能看到Achar 现在有不同的值了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多