如何从 8 个布尔值中创建一个字节(反之亦然)?

新手上路,请多包涵

我有 8 bool 变量,我想将它们“合并”成一个字节。

有没有简单/首选的方法来做到这一点?

反过来,将一个字节解码为 8 个独立的布尔值怎么样?

我假设这不是一个不合理的问题,但由于我无法通过谷歌找到相关文档,这可能是另一个“你的直觉都是错误的”案例。

原文由 xcel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 601
2 个回答

艰难的道路:

 unsigned char ToByte(bool b[8])
{
    unsigned char c = 0;
    for (int i=0; i < 8; ++i)
        if (b[i])
            c |= 1 << i;
    return c;
}

和:

 void FromByte(unsigned char c, bool b[8])
{
    for (int i=0; i < 8; ++i)
        b[i] = (c & (1<<i)) != 0;
}

或者很酷的方式:

 struct Bits
{
    unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
union CBits
{
    Bits bits;
    unsigned char byte;
};

然后您可以分配给工会的一个成员并从另一个成员那里读取。但请注意, Bits 中的位顺序是实现定义的。

请注意,在编写另一个联合成员之后读取一个联合成员在 ISO C99 中是明确定义的,并且作为几个主要 C++ 实现(包括 MSVC 和 GNU 兼容的 C++ 编译器)的扩展,但在 ISO C++ 中是未定义的行为。 memcpyC++20 std::bit_cast 是在便携式 C++ 中键入双关语的安全方法。

(此外, char 中的位域的位顺序是 实现定义 的,位域成员之间可能有填充。)

原文由 rodrigo 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可能想查看 std::bitset 。它允许您使用您期望的所有运算符将布尔值紧凑地存储为位。

当你可以抽象出来时,没有必要用比特翻转和诸如此类的东西鬼混。

原文由 user406009 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题