加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么是时间有效的算法来复制未对齐的位数组?

发布时间:2020-12-16 03:46:45 所属栏目:百科 来源:网络整理
导读:我过去必须多次这样做,而且我从未对结果感到满意. 任何人都可以建议一种快速的方法从源到目的地复制连续的位阵列,其中源和目标可能没有在方便的处理器边界上对齐(右移)? 如果源和目标都没有对齐,问题很快就会变成一个只有一个没有对齐的问题(在第一个副本之
我过去必须多次这样做,而且我从未对结果感到满意.

任何人都可以建议一种快速的方法从源到目的地复制连续的位阵列,其中源和目标可能没有在方便的处理器边界上对齐(右移)?

如果源和目标都没有对齐,问题很快就会变成一个只有一个没有对齐的问题(在第一个副本之后说).

作为一个起点,我的代码不可避免地最终看起来像下面这样(未经测试,忽略副作用,这只是一个关闭袖口的例子):

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) /* ... */
    }
}

(实际上这比我以前做的要好.看起来不太糟糕)

解决方法

你的内部循环占用两个字节,并将它们移动到目标字节.这几乎是最佳的.以下是一些没有特别顺序的提示:

>不需要一次限制自己一个字节.使用您的平台可以让您逃脱的最大整数大小.这当然会使您的起始逻辑和尾随逻辑复杂化.>如果使用无符号字符或整数,则可能不需要在向右移动后屏蔽第二部分源.这取决于您的编译器.>如果确实需要掩码,请确保编译器正在将循环中的表查找移动.如果不是,请将其复制到临时变量并使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读