【发布时间】:2011-07-30 13:21:27
【问题描述】:
我在 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;
};
现在我无法将向量编织在一起。我想编写一个名为 weave 的函数,它给定一个字符向量,交织它们的所有二进制扩展并返回它。例如,给定一个长度为 4 的无符号字符向量,它应该交织它们的二进制扩展并返回它的表示。我希望这适用于长度大于 8 的字符向量,因此我不能再将它们保存为无符号长长。我想我需要返回一个向量??但我不确定如何减少生成的二进制扩展。
我是 C++ 新手,因此请随时更正代码或给我建议。
提前致谢。
【问题讨论】:
-
我认为你应该将问题分成两个不同的部分:一个
class,它表示对任意内存区域的按位访问,你的算法使用该类的接口。由于前者应该类似于std::vector<bool>,因此您可以简单地编写代码来填充vector<bool>,给定void*和位数或字节数。这将涉及到向量的堆分配内存的潜在不必要的副本 - 如果需要,可以使用类内部的数据重新实现。如果此评论太含糊而无济于事,请告诉我。 -
我不确定你的意思。我是否需要一个类来表示按位访问,因为我已经可以直接使用 char、short、long 类型进行按位运算?你的意思是一个类将一个 char 变成一个长度为 8 的 vector
并使用它?问题是我需要非常有效地进行这种编织。 -
@alext87:是的,您已经可以对 char、short、long 进行按位运算,但是解决方案是否不需要将其扩展到更大的块(即 20 字节、300 字节)?我要说的是,您可以单独解决较大块上的按位运算问题,然后使用现有算法,或者您可以通过嵌入处理较大内存块的所有复杂性来使您的算法更加复杂:那就是更难获得和保持正确,但可能提供额外的优化机会。
-
如果您需要非常高的效率,我建议您放弃常量位移位并预先计算一个表,这样您就可以简单地将一个 8 位字符的位值用作 16 位预位拆分值,然后合并这些。例如,假设输入中的位是 abcdefgh 和 ijklmnop,您将索引到一个表,该表将 abcdefgh 映射到 0a0b0c0d0e0f0g0h 并将 ijklmnop 映射到 0i0j0k0l0m0n0o0p,然后位移一位和 OR。对输入数据中的每个字节执行此操作,然后在最后处理任何奇数小于 8 位的输入段。
-
(如果您想要一个有趣的提示:如果您将其表述为一个虚构的面试问题,那么您现在已经有了 10 个答案,其中一些带有工作代码 - 很有趣地方;-))。