【问题标题】:Fast bitset append?快速位集追加?
【发布时间】:2011-08-10 21:59:52
【问题描述】:

我正在寻找一种具有快速位附加功能的位集实现,其中可以一次有效地附加多个位。

例如

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);

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

例如

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没有这样的功能?能不能高效实施?

【问题讨论】:

    标签: c++ performance bitset


    【解决方案1】:

    使用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 或 1 附加到 bitset 中吗?例如11111, 00000。它将如何工作,例如10110?
    • @ronag:是的,它会附加全 0 或全 1,但您可以稍后重置它们。我会更新帖子,请稍等。
    • 如果 dynamic_bitset 有 .reserve 肯定会很好。 :-)
    • 注意位被提取的顺序。在这个函数中,LSB 被写入最左边的数组位置,即 set.size()-1,而在 dynamic_bitset 上,LSB 对应于第 0 个位置。结果是比特链颠倒了。
    猜你喜欢
    • 2015-06-10
    • 2016-12-03
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多