我过去必须多次这样做,而且我从未对结果感到满意.
任何人都可以建议一种快速的方法从源到目的地复制连续的位阵列,其中源和目标可能没有在方便的处理器边界上对齐(右移)?
如果源和目标都没有对齐,问题很快就会变成一个只有一个没有对齐的问题(在第一个副本之后说).
作为一个起点,我的代码不可避免地最终看起来像下面这样(未经测试,忽略副作用,这只是一个关闭袖口的例子):
const char mask[8] = { 1,3,7,15,31,63,127,255 }; /* Assume: * - destination is already zeroed,* - offsets are right shifts * - bits to copy is big (> 32 say) */ int bitarray_copy(char * src,int src_bit_offset,int src_bit_len,char * dst,int dst_bit_offset) { if (src_bit_offset == dst_bit_offset) { /* Not very interesting */ } else { int bit_diff_offset = src_bit_offset - dst_bit_offset; /* assume positive */ int loop_count; char c; char mask_val = mask[bit_diff_offset]; /* Get started,line up the destination. */ c = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val); c &= mask[8-dst_bit_offset]; *dst++ |= c; src_bit_len -= 8 - dst_bit_offset; loop_count = src_bit_len >> 3; while (--loop_count >= 0) * dst ++ = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val); /* Trailing tail copy etc ... */ if (src_bit_len % 8) /* ... */ } }
(实际上这比我以前做的要好.看起来不太糟糕)