gpt4 book ai didi

c++ - 以 std::bitset 访问 std::uint8_t

转载 作者:太空宇宙 更新时间:2023-11-04 15:31:09 24 4
gpt4 key购买 nike

我想在 C/C++ 中模拟一个状态寄存器,它应该可以作为 std::bitset 访问和 std::uint8_t .因此,我会将它们组合为 union ,如下所示:

#include <bitset>
#include <iostream>

union byte {
std::uint8_t uint;
std::bitset<8> bitset;
};

int main(int, char*[])
{
byte b = { .uint = 0b10101010 };

std::cout << "Value of bit 5: "
<< (b.bitset.test(5) ? "true" : "false") << std::endl;

std::cout << "Value of bit 4: "
<< (b.bitset.test(4) ? "true" : "false") << std::endl;

std::cout << "Bitset Output: " << b.bitset << std::endl;
std::cout << "Uint Output: " << static_cast<int>(b.uint) << std::endl;

return 0;
}

当使用 GCC x86_64 8.2 编译时,这似乎按预期工作.但是,我想知道我是否可以期望它在所有情况下都能正常工作,或者我是否可以使用一些辅助函数(如 bitsetbittest、...

最佳答案

你想在这里用 union 做什么被称为类型双关,在 C++ 中是未定义的行为(您可以阅读更多关于它的信息 in this SO answer ),因此即使在同一个编译器上也不能保证它能正常工作。

此外,即使允许,std::bitset<8>不保证与 std::uint8_t 具有相同的表示形式(事实上​​它不在任何主要编译器上)。

在您的情况下,您可以只使用常规的 std::bitset<8>to_ulong方法。

另一种选择是使用一个带有 bitset 成员的包装类,该类将提供方便的方法来分配/转换为 uint8_t .

此外,如果您只需要 std::bitset<8> 的一些有限 API ,环绕 std::uint8_t 可能是个好主意(如果您想将类的大小保持为 1 个字节)并手动实现这几个方法(如 test)。

关于c++ - 以 std::bitset 访问 std::uint8_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com