Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速位集追加?_C++_Performance_Bitset - Fatal编程技术网

C++ 快速位集追加?

C++ 快速位集追加?,c++,performance,bitset,C++,Performance,Bitset,我正在寻找一种具有快速位追加的位集实现,其中可以一次有效地追加多个位 e、 g 到目前为止,我已经尝试过boost::dynamic_位集和std::vector。两者都很慢 旧帖子 我正在使用boost::dynamic_位集来打包一些数据 通常我希望一次打包~5位,这将导致如下调用: char value = 31; char n_bits = 5; boost::dynamic_bitset<> bits; for(char n = n_bits-1; n >= 0;

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

e、 g

到目前为止,我已经尝试过boost::dynamic_位集和std::vector。两者都很慢


旧帖子

我正在使用boost::dynamic_位集来打包一些数据

通常我希望一次打包~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值=31;
字符n_位=5;
boost::动态_位集位;
用于(字符n=n_位-1;n>=0;--n)
位。推回((值>>n)和1);
然而,在我看来,这似乎是相当低效的,难道不能一次添加所有位吗

e、 g

char值=31;
字符n_位=5;
boost::动态_位集位;
位。追加(值,n_位);
我希望它能做如下事情:

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
}
模板
无效附加(T值、大小\u T n\u位)
{
值使用成员函数

/* 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;
    }
}
/*将低位nbits位从值追加到集合*/
模板
void append(boost::动态位集&集、T值、大小位)
{
set.resize(set.size()+nbits);
对于(尺寸i=1;i>=1;
}
}

但这不会只是在位集中附加几个0或1吗?例如11111000000。它对例如10110如何工作?@ronag:是的,它会附加所有0或所有1,但你可以稍后重置它们。我会更新帖子,给我一点时间。如果动态位集有
。reserve
-)肯定会很好注意提取位的顺序。在此函数中,LSB被写入最左侧的数组位置,即set.size()-1,而在dynamic_bitset上,LSB对应于第0个位置。结果是位链被反转。
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
}
/* 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;
    }
}