将std :: stringstream中的位提取到std :: bitset

时间:2013-11-29 01:25:00

标签: c++ stl std

根据我在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,其他一切都应该没问题。

我想知道是否有办法实现这个修饰符?

1 个答案:

答案 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上的完整示例。