快速bitset追加? [英] Fast bitset append?

查看:156
本文介绍了快速bitset追加?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



例如







$ 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没有这样的函数?

解决方案

使用 resize 成员函数。

  / *将低位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 <= nbits; 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追加?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆