2011-04-22 35 views
2

我正在寻找快速位附加的bitset实现,其中几个位可以有效地附加在一个地方。快速位集追加?

例如

char value = 31; 
char n_bits = 5; 
fast_bitset bits; 
bits.append(value, n_bits); 

我到目前为止尝试过boost :: dynamic_bitset和std :: vector。这两者都很慢。


旧帖子

我使用boost ::来,dynamic_bitset收拾一些数据。

通常我想在同一时间,这将导致像调用pack〜5位:

char value = 31; 
char n_bits = 5; 
boost::dynamic_bitset<> bits; 
for(char n = n_bits-1; n >= 0; --n) 
    bits.push_back((value >> n) & 1); 

然而,这对我来说相当低效,不可能一个一个去添加所有的位?

例如

char value = 31; 
char n_bits = 5; 
boost::dynamic_bitset<> bits; 
bits.append(value, n_bits); 

我希望它这样做:

template<typename T> 
void append(T value, size_t n_bits) 
{ 
    value <<= sizeof(T) - n_bits; // Make target bits most significant, remove all non-target bits. 

    // TODO: Shift bits into proper place and use OR to add all target bits to bitset in one go 
} 

为什么不来,dynamic_bitset有这样的功能?是否有可能有效实施?

回答

2

使用resize成员函数。

/* Append the lower-order nbits bits from value to set. */ 
template <typename T> 
void append(boost::dynamic_bitset<> &set, T value, size_t nbits) 
{ 
    set.resize(set.size() + nbits); 
    for (size_t i=1; i<=nbits; i++) { 
     set[set.size() - i] = value & 1; 
     value >>= 1; 
    } 
} 
+0

但是,不会只是追加几个0或1的bitset?例如11111,00000.它将如何工作10110? – ronag 2011-04-22 11:16:14

+0

@ronag:是的,它会追加全0或全1,但您可以稍后重置它们。我会更新帖子,给我一秒钟。 – 2011-04-22 11:17:30

+3

如果dynamic_bitset具有'.reserve',那肯定会很好。 :-) – 2011-04-22 12:56:01