2012-04-18 2 views
3

У меня есть (циклическая) bitset<N> и хотел бы получить подстроку i...i+K-1 (где это могло случиться, что i = N - 1; K = 5, поэтому он должен обернуть вокруг и получить N-1; 0; 1; 2; 3), а другой bitset<K> (К конечно известно во время компиляции)фрагмент подстроку из циклического BitSet

Очевидная вещь не работает, потому что operator & не допускает операнды разных размеров (хотя это было бы тривиально?)

bitset<N> data = ...; 
bitset<K> mask; mask = ~mask; 
bitset<K> rotated = in << i | in >> (K - i); 
bitset<K> slice = rotated & mask; 

следующая лучшая вещь Безразлично» т с большими N

bitset<K> slice(rotated.to_ullong() & mask.to_ullong()); 

Что делать, если не реализовано bitset<min<N,K>::value> operator &(bitset<N>,bitset<K>)? (и, возможно, не так ужасно неэффективен, этот подход копирует набор 3 раза)

ответ

2

Как вы видели, ни одна из функций открытого члена битов не поддерживает копирование между битами разных размеров. Функция convert to ulong не полезна, если у вас есть наборы, которые не будут помещаться в ulong. Я не понимаю, почему стандарт не мог, по крайней мере, иметь конструктор копирования и оператор присваивания, поддерживающий разные размеры. Тем не менее, учитывая стандартный класс, я не вижу возможности копировать бит по одному.

Я хотел бы предложить что-то вроде следующего:

 
template⟨size_t D_SZ,size_t S_SZ⟩ 
void CopyBitset(std::bitset⟨D_SZ⟩ &dest, const std::bitset⟨S_SZ⟩ &source,size_t idx, 
    size_t count,size_t destidx=0) 
{ 
     for(size_t i = 0; i != count;++i){ 
       dest.set((i + destidx) % D_SZ, source[(i + idx) % S_SZ]);  
     } 
} 

По крайней мере сдвига и операции объединяются копирования. Вы также можете взглянуть на динамический набор битов boost, чтобы узнать, будет ли он более точно соответствовать вашему использованию.