我有两个带有掩码的十六进制字符串,我想将它们合并为一个字符串值/掩码对。字符串可能有重叠的字节,但在应用掩码之后,没有重叠位应该与该位的值相矛盾,即 value1 = 0x0A mask1 = 0xFE 和 value2 = 0x0B, mask2 = 0x0F 基本上表示生成的合并必须具有上半字节全为 0,下半字节必须为 01011
我已经使用直接 c 完成了这项工作,将字符串转换为字节数组并将 memcpy'ing 转换为缓冲区作为原型。它已经过测试,似乎可以工作。但是,它丑陋且难以阅读,并且不会针对与特定位要求相矛盾的情况抛出异常。我考虑过使用位集,但是还有另一种可能不需要转换开销的方法吗?性能会很好,但并不重要。
编辑:更详细,虽然写这篇文章让我意识到我把一个简单的问题弄得太难了。但是,无论如何,它就在这里。
我得到了大量输入,它们是混合内容文档的二进制搜索。文档被分成页面,页面由 api 提供,一次提供一个页面。每个页面都需要使用提供的搜索词进行搜索。
在请求页面之前,我拥有所有搜索词。输入是表示十六进制数字的字符串(这就是我所说的十六进制字符串)以及一个掩码,用于指示输入十六进制字符串中的重要位。由于我预先获得了所有输入,因此我想改进对返回的每个页面的搜索。我想预处理将这些十六进制字符串合并在一起。为了使问题更有趣,每个字符串在它们必须出现的页面中都有一个可选的偏移量,并且缺少偏移量表示该字符串可以出现在请求的页面中的任何位置。所以,像这样:
class Input {
public:
int input_id;
std::string value;
std::string mask;
bool offset_present;
unsigned int offset;
};
如果给定的 Input 对象具有offset_present = false
,则忽略分配给 offset 的任何值。如果 offset_present 为 false,那么它显然不能与其他输入合并。
为了使问题更有趣,我想报告一个输出,该输出提供有关所找到内容的信息(找到的 input_id、偏移量在哪里等)。合并一些输入(但不是其他输入)使这变得更加困难。
我曾考虑定义一个 CompositeInput 类,并且正在考虑将底层合并作为一个位集,但进一步阅读有关位集的内容让我意识到这并不是我真正的想法。我的经验不足使我放弃了复合的想法,并开始使用蛮力。当找到输入时,我必须跳过有关其他输入类型的一些详细信息,以及为输出收集的附加信息(例如,页码、段落号)。这是一个示例输出类:
class Output {
public:
Output();
int id_result;
unsigned int offset_result;
};
如果我合并 N 个十六进制字符串,我会想要生成其中的 N 个,从而对用户隐藏任何合并细节。