【发布时间】:2018-04-10 09:30:46
【问题描述】:
我手头有一个问题并以一种方式解决了它,但我不满意我是如何解决它的,因为它并不适用于所有情况。解决方案必须在 C++(11) 中。
我有一个 char 数组和一个 int。给定相对于数据的位偏移和长度(以位为单位)。我想从数组中提取偏移量到偏移量+长度的位并将它们存储出来。
char8_t data[8];
int32_t out;
int32_t offset;
int32_t length;
Figure 和 offset=24; length=4;
偏移量和长度都只在运行时可用。因此,我想避免创建位掩码。我个人通过将完整数组转换为 int64_t 然后右移 (64-offset-length) 和左移 (64-length) 来解决它。
out = (*(int64_t*)data) >> (64-offset-length) << (64-length);
问题:如果我的数组更长,就没有原语来捕获完整的数组。我的解决方案不再有效。有没有更好的(缩放)方法来做到这一点?
在理想世界中,我可以创建一个带有一点偏移的指针,但这是 C++ 而不是理想世界。
替代方案我想过:通过遍历数组和左移来将 += 加到“out”上。 相当不雅!
我知道存在类似的问题,但要么回答得不好,要么答案对性能有很大影响。
【问题讨论】:
-
不需要从头开始转换数组。添加一些初始偏移量。
reinterpret_cast<uint64_t const *>(data + (offset / 8)) -
如果我有一个 uint64_t 作为目标并且
offset%8 != 0仍然会出现同样的问题。而且我需要检查我是否没有创建一个“比数组长”的 int。 -
没有问题。在这种情况下,您需要获取
uint64_t加一个字节。 -
@VTT 你会得到未对齐的访问,这是个大问题。
-
@PasserBy 如果未对齐的访问是一个问题,则可以调整偏移量以正确对齐。主要思想是无需将整个
data块存储在单个整数变量中,仅获取覆盖所需范围的两个整数就足够了。