[問題] 如何將整個陣列的資料進行位移?

作者: 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