快速bitset附加?

时间:2011-04-22 10:59:15

标签: c++ performance bitset

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

e.g。

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

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


旧帖子

我正在使用boost :: dynamic_bitset来打包一些数据。

通常我想一次打包~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);

然而,这对我来说效率很低,不能一次性添加所有位吗?

e.g。

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没有这样的功能?是否有可能有效实施?

1 个答案:

答案 0 :(得分: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;
    }
}