c++ - C++ 中二进制表示的交织 vector

标签 c++ templates binary

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

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;
};

现在我在将 vector 编织在一起时遇到了麻烦。我想编写一个名为 weave 的函数,它给定一个字符 vector 交织所有的二进制扩展并返回它。例如,给定一个长度为 4 的无符号字符 vector ,它应该交织它们的二进制扩展并返回其表示形式。我希望这适用于长度大于 8 的字符 vector ,因此我不能再将它们保存在 unsigned long long 中。我想我需要返回一个 vector ??但我不确定如何削减生成的二进制扩展。

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

提前致谢。

最佳答案

编辑:我想我把你的问题弄错了(坦率地说,我仍然不能准确地说出你帖子中的实际问题是哪里)。如果问题是“我应该将什么作为参数以及我应该返回什么类型?”,也许你应该有一个 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;
}

不要如果这进入生产代码就忘记添加检查、断言等。

关于c++ - C++ 中二进制表示的交织 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5562290/

相关文章:

c++ - Visual Studio 2010 中 shared_ptr 的编译器错误

c++ - 我应该在包含虚方法的类上使用 'memcpy' 吗?如果不是,如何替换它?

C++ 模板 <R(*)(T)> 含义

不同类型的 C++ 模板错误

c++ - 为什么EXE不是二进制的?

python - 如何将输入的二进制文件转换为文本python

c++ - 10 毫秒 C++ 执行时间

c++ - 如何在qt中删除之前检查指针是否存在

c++ - 函数模板在另一个类/命名空间中的特化?

从压缩文件和已知起始位置(字节偏移)读取 R 中的二进制文件