Свяжите повышение:: dynamic_bitset или станд.:: bitset

что лучший способ состоит в том, чтобы связать 2 bitsets?

Например, я имею

boost::dynamic_bitset<> test1( std::string("1111") );
boost::dynamic_bitset<> test2( std::string("00") );

они должны быть связаны в thrid Bitset test3, который затем содержит

111100 

Решения должны использовать повышение:: dynamic_bitset. Если решение работает со станд.:: bitset, это было бы хорошо также. Должно быть внимание на производительность при конкатенации битов.

ОБНОВЛЕНИЕ: я сравнил оба метода (stringmethod от меня и Neil и shiftmethod из средства рассылки), и stringmethod был намного быстрее (фактор 10 ++). Кодируйте здесь: http://pastebin.com/HfpfYfy8

Я надеюсь, что Pastebin хорошо для регистрации долгих листингов кода. Если существует лучший путь, свяжитесь со мной.

8
задан MOnsDaR 23 June 2010 в 10:29
поделиться

3 ответа

Для стандартного битового набора, что-то вроде:

#include <bitset>
#include <string>
#include <iostream>
using namespace std;

template <size_t N1, size_t N2 >
bitset <N1 + N2> concat( const bitset <N1> & b1, const bitset <N2> & b2 ) {
    string s1 = b1.to_string();
    string s2 = b2.to_string();
    return bitset <N1 + N2>( s1 + s2 );
}

int main() {
    bitset <4> a( string("1010") );
    bitset <2> b( string("11") );
    cout << concat( a, b ) << endl;
}
10
ответ дан 5 December 2019 в 07:33
поделиться

Для начала я сам добавлю возможное решение. В следующем коде используется возможность создания битовых наборов с помощью std :: string и генерации std :: string из битового набора.

#include <sstream>  // for std::ostringstream
#include <boost/dynamic_bitset.hpp>

boost::dynamic_bitset<> test1( std::string("1111") );
boost::dynamic_bitset<> test2( std::string("00") );

std::ostringstream bitsetConcat;
bitsetConcat << test1 << test2;
boost::dynamic_bitset<> test3( bitsetConcat.str() );

std::cout << test3 << std::endl;

Это работает, но должны быть другие, более эффективные решения ...

Обновление:
Спасибо J. C. Leitão за его предложение редактирования

2
ответ дан 5 December 2019 в 07:33
поделиться

Вот решение проблемы. Не уверен, компилируется ли он.

typedef boost::dynamic_bitset<> Bits;

Bits Concatenate(const Bits& first, const Bits& second)
{
    Bits value(first);

    //Increase the size of the bit buffer to fit the data being placed in it
    value.resize(first.size() + second.size());
    value <<= second.size();
    value |= second;
    return value;
}
0
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: