类似memcpy()的位向量函数?

时间:2014-09-11 17:03:37

标签: c++ bit-manipulation memcpy idiomatic bitvector

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

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

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

并且该数据以字节存储,因此没有字节顺序发生,并且较低的位在向量中首先出现。我们可以使签名更复杂以适应其他假设,但现在不用担心。

所以,

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

1 个答案:

答案 0 :(得分: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函数。