自己最近在做一個(gè)涉及到內(nèi)容壓縮的項(xiàng)目,需要把數(shù)據(jù)按照二進(jìn)制的方式來處理(比如LZ77壓縮、霍夫曼編碼等),涉及到比較多的函數(shù)和功能。
但是自己做的時(shí)候發(fā)現(xiàn),雖然c 提供了比較全面的二進(jìn)位操作,但是主要是基於某一個(gè)資料型別進(jìn)行二進(jìn)位操作(比如char),而char又是預(yù)設(shè)是8位的,這對於跨字符操作不是很方便,需要做比較多的判斷。
可能我表示的也不是很清楚,或者對c 的理解也有問題,但是我是希望能找到一個(gè)可以行雲(yún)流水般處理二進(jìn)制的方法...或者有沒有比較好用的庫?
有沒有朋友在這方面有經(jīng)驗(yàn)可以指點(diǎn)一二,感激不盡,如果有幫助,我會(huì)私戳發(fā)紅包表示感謝。
歡迎選擇我的課程,讓我們一起見證您的進(jìn)步~~
如果你想要大一點(diǎn)的字元表示範(fàn)圍,可以用wchar_t。
如果你想要一個(gè)可以把記憶體中的資料以任意一位作為一個(gè)位元組的開始的型別,那肯定是不可能實(shí)現(xiàn)的。
但是你可以
`nl=((arr[0]&c0)>>6);
nh=((arr[1] &0x0f) n=nh|nl;`
來把前一個(gè)位元組的高2位元和後一個(gè)位元組的低4位元拼成一個(gè)6位元二進(jìn)制數(shù)
都用二進(jìn)位了,還考慮字元?
二進(jìn)位就應(yīng)該只考慮位元組吧?
壓縮演算法的話,很多時(shí)候是不考慮字元的,因?yàn)檩斎霗n可能是ASCII,可能是UTF-8,可能是UTF-16(LE/BE),或是GBK等等。但是歸根究底,語言的共通性就是統(tǒng)計(jì)上存在一定規(guī)律。
例如英文中e的出現(xiàn)頻率高,或是is這種單字出現(xiàn)頻率高,或是se、tor之類的詞綴出現(xiàn)頻率高。
壓縮的根本原理就是用盡量少的bit代表出現(xiàn)頻率高的東西,減少冗餘,所以一般來說跟字元沒關(guān)係。
你多了解一下壓縮演算法吧,LZ77/LZ78/霍夫曼這些都是通用的壓縮演算法,不只限於文本,是以bit為單位的。
說回C++,C++要求一個(gè)東西的大小編譯期可知(棧分配記憶體編譯器確定),而輸入的文字運(yùn)行期才知道,所以理論上沒有什麼很好的方法。字元集、文字編碼是一個(gè)深坑,不建議跳進(jìn)去。
如果你是說要以bit為單位做操作的話,自己封裝一個(gè)函式庫吧,或是boost之類的有一些函式庫能用。畢竟CPU裡最小也是一個(gè)字節(jié),只不過能操作裡面的每一位而已。