根据我在std::bitset
找到的一些文档:
它们也可以直接插入并以二进制格式从流中提取(参见适用的运算符)。
适用的运营商:
是,OS basic_istream或basic_ostream对象,分别从中提取或插入bitset对象。插入/提取位集的格式是(适当加宽)'0'和'1'字符的序列。
template<class charT, class traits, size_t N>
basic_istream<charT, traits>&
operator>> (basic_istream<charT,traits>& is, bitset<N>& rhs);
template<class charT, class traits, size_t N>
basic_ostream<charT, traits>&
operator<< (basic_ostream<charT,traits>& os, const bitset<N>& rhs);
这实质上意味着我们可以做以下事情:
std::stringstream _stream(std::ios::binary);
{...}
std::bitset<16> a1;
std::bitset<8> a2;
_stream >> std::bin >> a1;
_stream >> std::bin >> a2;
在我看来,我只是在标准库中没有 std::bin
,其他一切都应该没问题。
我想知道是否有办法实现这个修饰符?
答案 0 :(得分:1)
没有像std::bin
流操作符这样的东西,但是如果你想逐位编写std::bitset
内容,你可以尝试以下方法:
template<std::size_t num_bits>
void writeBits(ostream& os, const std::bitset<num_bits>& thebits)
{
for(std::size_t bit_pos = 0; bit_pos < num_bits;)
{
unsigned char currentByte = 0;
for(int currentBit = 0;
currentBit < sizeof(unsigned char) &&
bit_pos < num_bits;
++currentBit, ++bit_pos)
{
currentByte |= thebits[bit_pos] ? (0x80 >> currentBit) : 0;
}
os << currentByte;
}
}
请参阅ideone上的完整示例。
反过来只有在知道预先阅读的std::bitset<>
部分的大小时才会有效:
template<std::size_t num_bits>
void readBits(istream& is, std::bitset<num_bits>& thebits)
{
thebits.reset();
std::size_t total_bytes = num_bits / sizeof(unsigned char) + 1;
std::size_t bit_pos = 0;
for(std::size_t i = 0;
is &&
i < total_bytes &&
bit_pos < num_bits;
++i)
{
unsigned char currentByte = 0;
if(is >> currentByte)
{
for(int currentBit = 0;
currentBit < sizeof(unsigned char) &&
bit_pos < num_bits;
++currentBit, ++bit_pos)
{
thebits[bit_pos] = (currentByte & (0x80 >> currentBit)) > 0;
}
}
}
}
请参阅ideone上的完整示例。