что лучший способ состоит в том, чтобы связать 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 хорошо для регистрации долгих листингов кода. Если существует лучший путь, свяжитесь со мной.
Для стандартного битового набора, что-то вроде:
#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;
}
Для начала я сам добавлю возможное решение. В следующем коде используется возможность создания битовых наборов с помощью 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 за его предложение редактирования
Вот решение проблемы. Не уверен, компилируется ли он.
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;
}