将 bitset 转换为 unsigned char,反之亦然
Casting a bitset to unsigned char, and vice versa
使用 unsigned char 数组,表示位。我遇到了以下情况。在 MSVC 2013 上,将 std::bitset<8>
转换为 char,然后返回。似乎是一件有效的事情。
但是在C++11 ISO标准中。我找不到这个有效的参考。据我所知,std::bitset
只是一个 bool
数组。具有更多的内存经济实现和一些围绕它的功能。
简而言之,我的问题是:下面的代码是否有效。
unsigned char* myChar = new unsigned char(0x0F);
((std::bitset<8>*)myChar)->set(2);
((std::bitset<8>*)myChar)->reset(6);
std::cout << "expression result:" << (uint8_t)*myChar;
这是未定义的行为。该标准仅说明
The class template bitset<N>
describes an object that can store a sequence consisting of a fixed number of
bits, N
.
它没有说明这个 class 的内部布局。无法保证 sizeof(bitset<8>)
是 1
。在我的实现中,它恰好是 8
。因此,您对 class 的内部结构所做的任何假设都只是 - 一个假设。如果你想将 unsigned char
转换为 bitset<8>
,已经有一个简单的方法可以做到这一点:
unsigned char myChar = 0x0F;
std::bitset<8> bs(myChar);
使用 unsigned char 数组,表示位。我遇到了以下情况。在 MSVC 2013 上,将 std::bitset<8>
转换为 char,然后返回。似乎是一件有效的事情。
但是在C++11 ISO标准中。我找不到这个有效的参考。据我所知,std::bitset
只是一个 bool
数组。具有更多的内存经济实现和一些围绕它的功能。
简而言之,我的问题是:下面的代码是否有效。
unsigned char* myChar = new unsigned char(0x0F);
((std::bitset<8>*)myChar)->set(2);
((std::bitset<8>*)myChar)->reset(6);
std::cout << "expression result:" << (uint8_t)*myChar;
这是未定义的行为。该标准仅说明
The class template
bitset<N>
describes an object that can store a sequence consisting of a fixed number of bits,N
.
它没有说明这个 class 的内部布局。无法保证 sizeof(bitset<8>)
是 1
。在我的实现中,它恰好是 8
。因此,您对 class 的内部结构所做的任何假设都只是 - 一个假设。如果你想将 unsigned char
转换为 bitset<8>
,已经有一个简单的方法可以做到这一点:
unsigned char myChar = 0x0F;
std::bitset<8> bs(myChar);