[问题] 如何将整个阵列的资料进行位移?

楼主: handofn0xus (你真是糟糕的小焰)   2023-02-07 11:27:24
最近遇到需要把Bitmap中的资料进行位移的情况
Bitmap是以char*的形式进行储存
今天我想做的事是
以下列为例:
char bitmap[]={0xA5,0x05,0x05}
1. 我今天想从bitmap[0]的第五个位元进行右移2
2. 同时bitmap[2]的资料不会因为右移而消失 而是到bitmap[3]
也就是结果会变成
{0xA1,0x41,0x41,0x40}
2.可以透过realloc解决 所以不算是问题
但是1.我就不知道该怎么下手了 我实在不知道怎么把不同元素的资料位移到下个元素去
而资料不会消失
想请教各位先进 要怎么样才能达到我想要的效果呢?
作者: terter (terter)   2023-02-07 11:59:00
一时想到比较笨的方法是,从最后解。假设原阵列A,新阵列BB[3]=A[2]<<6, B[2]=A[1}<<6+A[2}>>2想了一下,好像用型别转换去作比较快,一次可以处理多个譬如说用uint64这种
作者: Lipraxde (Lipraxde)   2023-02-07 15:27:00
有更完整的使用情境吗?
作者: lwecloud (CloudEX)   2023-02-07 15:28:00
tmp = bitmap[i] & 0xFC;bitmap[i] = (bitmap[i] >> 6) & 0x3F;bitmap[i] |= (remain << 6) & 0xC0;remain = tmp;这样呢? (用推文好难打 囧)第一行就错了 tmp = bitmap[i] & 0x3; 才对...阳春做法,搞不好有些library可以直接做到
作者: leolarrel (真.粽子无双)   2023-02-07 17:37:00
terter的型别转换法目前看起来最快最简洁
作者: don323 (咚薯叔)   2023-02-08 08:13:00
类似二楼的写法就是最快的,客制化各种运算
作者: johnjohnlin (嗯?)   2023-02-08 21:47:00
char不小心shift太多会UB,最好先转unsigned戳到MSB变1会是UB
作者: yesiah   2023-02-09 11:50:00
stackoverflow 有类似的讨论https://stackoverflow.com/q/70043899看了一下有两个方向一个是想办法用SIMD instructions,另一个是一边写loop一边看assembly有没有良好vectorize第二个方法可能要加__restrict让compiler知道src跟dst不重叠,所以他可以做更多最佳化
作者: longlongint (华哥尔)   2023-04-09 23:03:00
如果要平行化 又不用省空间的话 挂一层f(idx)就可以分段copy了

Links booklink

Contact Us: admin [ a t ] ucptt.com