gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:19:58 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com