在C ++中交织二进制表示的向量

时间:2011-04-06 06:31:16

标签: c++ templates binary

我在C ++中有一个名为weave的模板化函数,它接受两个无符号字符并交织它们的二进制扩展并返回一个unsigned short。它还可以使用两个无符号短路并交织它们的二进制扩展以返回无符号长整数。这是我写的:

template<class Typeout, class Typein>
Typeout weave(Typein lhs,Typein rhs)
{
//Need to check that Typeout contains enough storage to contain 2*Typein:
assert(sizeof(Typeout)>=2*sizeof(Typein));

Typeout weaved = 0;
for(int k=0;k<sizeof(Typein)*8;k++)
{
    //weave in the kth element of rhs and lhs.
    weaved |=(Typeout(rhs & (Typein)(1<<k)) << k)| (Typeout(lhs & (Typein)(1<<k)) << (k+1));
}
return weaved;
};

现在我在编织矢量时遇到了麻烦。我想编写一个名为weave的函数,给出一个字符向量交织所有的二进制扩展并返回它。例如,给定长度为4的无符号字符的向量,它应该交织它们的二进制扩展并返回它的表示。我想这适用于长度大于8的字符向量,所以我不能再将它们保持在无符号的长整数中。我想我需要返回一个矢量?但我不确定如何减少最终的二进制扩展。

我是C ++的新手,所以请随时更正代码或给我建议。

提前致谢。

1 个答案:

答案 0 :(得分:0)

编辑:我认为我的问题有误(坦率地说,我仍然不能确切地说 是你帖子中的实际问题)。如果问题是“我应该把什么作为参数以及我应该返回什么类型?”,也许你应该有一个const T*const std::vector<T>&参数用于输入而另一个用于输出而不是返回,这样可以避免分配内存所有权问题。

// base case, weave two 8 bit into a 16 bit word.
uint16_t weave(uint8_t a, uint8_t b) {
    uint16_t x = a, y = b;
    x = (x | (x << 4)) & 0x0F0F;
    x = (x | (x << 2)) & 0x3333;
    x = (x | (x << 1)) & 0x5555;

    y = (y | (y << 4)) & 0x0F0F;
    y = (y | (y << 2)) & 0x3333;
    y = (y | (y << 1)) & 0x5555;

    return x | (y << 1);
}

// most useful way in my opinion
// weave bits from two arrays 'a' and 'b' of size n
// into a pre-allocated vector 'out'
void weave(const char* a, const char* b, char* out, size_t n) {
    uint16_t* ret = (uint16_t*) out;

    for(size_t i = 0; i != n; ++i) {
        ret[i] = weave(a[i], b[i]);
    }
}

// template version, for those that like sugar
template<typename OUT, typename IN>
OUT weave(IN a, IN b, size_t n = 1) {
    OUT out;
    weave((char*) &a, (char*) &b, (char*) &out, sizeof(IN)*n);
    return out;
}

不要如果进入生产代码,请忘记添加支票,断言等。