C++ 快速位集追加?
我正在寻找一种具有快速位追加的位集实现,其中可以一次有效地追加多个位 e、 g 到目前为止,我已经尝试过boost::dynamic_位集和std::vector。两者都很慢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;
旧帖子 我正在使用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;
}
}