作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有 8 个 bool
变量,我想将它们“合并”成一个字节。
有没有简单/首选的方法来做到这一点?
反过来,将一个字节解码为 8 个独立的 boolean 值怎么样?
我进来假设这不是一个不合理的问题,但由于我无法通过 Google 找到相关文档,这可能是另一种“你的直觉都错了”的案例。
最佳答案
艰难的道路:
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;
};
然后您可以分配给 union 的一个成员并从另一个成员读取。但请注意,Bits
中的位顺序是实现定义的。
请注意,在编写另一个 union 成员之后读取一个 union 成员在 ISO C99 中是明确定义的,并且作为几个主要 C++ 实现(包括 MSVC 和 GNU 兼容的 C++ 编译器)的扩展,但在 ISO C++ 中是未定义行为。 memcpy
或 C++20 std::bit_cast
是在可移植 C++ 中键入双关语的安全方法。
(此外,char
中位域的位序为 implementation defined,位域成员之间可能有填充。)
关于c++ - 如何从 8 个 boolean 值中创建一个字节(反之亦然)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461126/
我是一名优秀的程序员,十分优秀!