问题描述
例如
$ b b
char value = 31;
char n_bits = 5;
fast_bitset bits;
bit.append(value,n_bits);
我已经尝试过boost :: dynamic_bitset和std :: vector。
$ b
旧帖 b $ b
我使用boost :: dynamic_bitset来打包一些数据。
通常我想一次打包〜5位,调用像:
char value = 31;
char n_bits = 5;
boost :: dynamic_bitset<>位;
for(char n = n_bits-1; n> = 0; --n)
bits.push_back((value>>> n)& 1);
但是这似乎对我来说效率不高,不能一次性添加所有的位? / p>
例如
char value = 31;
char n_bits = 5
boost :: dynamic_bitset<>位;
bit.append(value,n_bits);
我会期望它做类似的操作:
template< typename T>
void append(T value,size_t n_bits)
{
value<< = sizeof(T) //使目标位最重要,删除所有非目标位。
// TODO:将位移入正确的位置,并使用OR将所有目标位一次性添加到bitset
}
为什么dynamic_bitset没有这样的函数?
使用成员函数。
/ *将低位nbits位从值附加到设置。 * /
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 set [set.size() - i] = value& 1;
value>> = 1;
}
}
I'm looking for a bitset implementation with fast bit appending, where several bits can be efficiently appended in one go.
e.g.
char value = 31;
char n_bits = 5;
fast_bitset bits;
bits.append(value, n_bits);
I have so far tried boost::dynamic_bitset and std::vector. Both of which are slow.
Old Post
I'm using boost::dynamic_bitset to pack some data.
Usually I want to pack ~5 bits at a time which would result in a call like:
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);
However this seems to me quite inefficient, couldn't one add all the bits in one go?
e.g.
char value = 31;
char n_bits = 5;
boost::dynamic_bitset<> bits;
bits.append(value, n_bits);
I would expect it to do something like:
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
}
Why doesn't dynamic_bitset have such a function? Would it be possible to implement efficiently?
Use the resize
member function.
/* 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;
}
}
这篇关于快速bitset追加?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!