0

我有一个位向量,我想将它的一部分复制到另一个向量(例如,为简单起见,复制到另一个向量的开头)。请注意,所有位可能需要在某个方向上移动(或者更确切地说,旋转),而不仅仅是第一个元素,因为每个字节内的位对齐方式会发生变化。

为清楚起见,假设签名是:

void *memcpy_bits(
    char* destination,
    char* source,
    size_t offset_into_source_in_bits,
    size_t num_bits_to_copy);

并且该数据以字节存储,因此没有字节序问题,并且低位首先出现在向量中。我们可以使签名更复杂以适应其他假设,但暂时不要介意。

所以,

  • 是否有一些硬件支持这样做(我的意思是在 x86 或 x86_64 CPU 上)?
  • 是否有此功能的一些标准/惯用/广泛使用的实现(或类似的东西)?
4

1 回答 1

1

首先,您必须定义数据的存储方式。它是否存储在 uint8_t、uint16_t、uint32_t 或 uint64_t 的数组中?位 #0 是否存储为值 1u << 0?您可能不应该使用 void* 而是用于存储数据的基础类型。

其次,您显然可以假设 offset_into_source_in_bits 小于底层数据类型中的位数(如果不是,您会怎么做?)

第三,如果该偏移量为 0,那么您可以调用 memcpy。这是一件很重要的事情,因为如果偏移量为 0,下面的代码将不起作用。

第四,只要 num_bits_to_copy >= 底层类型中的位数,您就可以使用两次移位计算下一个要存储到目的地的单元。

第五,如果 0 < num_bits_to_copy < 底层类型中的位数,那么您需要注意不要读取任何实际不存在的源位。

您可能需要小心不要覆盖任何您不应该覆盖的位,而且我个人也会对目标位进行偏移,因此您可以复制任意范围的位。我也可以实现一个 memmove_bits 函数。

于 2014-09-11T17:14:03.440 回答