我有一个位向量,我想将它的一个片段复制到另一个向量(比如说,为了简单起见,到另一个向量的开头)。请注意,所有位可能需要在某个方向上移位(或者更确切地说,旋转),而不仅仅是第一个元素,因为每个字节内的位对齐会发生变化。
为清楚起见,假设签名是:
void *memcpy_bits(
char* destination,
char* source,
size_t offset_into_source_in_bits,
size_t num_bits_to_copy);
并且该数据以字节存储,因此没有字节顺序发生,并且较低的位在向量中首先出现。我们可以使签名更复杂以适应其他假设,但现在不用担心。
所以,
答案 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函数。