私は現在、データをバイナリ方式で処理する必要があるコンテンツ圧縮に関するプロジェクト (LZ77 圧縮、ハフマンコーディングなど) に取り組んでおり、多くの機能が含まれます。
しかし、自分でやってみると、c は比較的包括的なバイナリ演算を提供しますが、主に特定のデータ型 (char など) に基づいており、char はデフォルトで 8 ビットであるため、適切ではないことがわかりました。十字文字の場合 操作はあまり便利ではなく、多くの判断を必要とします。
私の表現がわかりにくいのか、c の理解に問題があるのかもしれませんが、バイナリをスムーズに扱える方法を見つけたいです...または、もっと使いやすいライブラリはありますか? ?
この分野の経験がある友人でアドバイスをくれる人はいますか? とても感謝しています。もし役に立てれば、感謝の気持ちを込めて赤い封筒を個人的に送ります。
より広い文字表現範囲が必要な場合は、wchar_t を使用できます。
しかし、できますメモリ内のデータのバイトの先頭として任意のビットを使用できる型が必要な場合、それを実現することは間違いなく不可能です。
`nl=((arr[0]&c0)>>6);
nh=((arr[1] &0x0f) <n=nh|nl;`
前のバイトの上位2ビットと次のバイトの下位4ビットを組み合わせて6桁の2進数にしてみましょう
すでにバイナリを使用していますが、文字についても考慮しますか?
バイナリはバイトのみを考慮すべきですよね?
入力ファイルが ASCII、UTF-8、UTF-16 (LE/BE)、または GBK などである可能性があるため、圧縮アルゴリズムでは文字が考慮されないことがよくあります。しかし、結局のところ、言語の共通点は、統計には一定の法則があるということです。
例えば、英語ではeが頻繁に現れたり、isのような単語が頻繁に現れたり、seやtorなどの接辞が頻繁に現れたりします。
圧縮の基本原則は、頻繁に出現するものをできるだけ少ないビットで表現し、冗長性を減らすことです。そのため、通常は文字とは関係ありません。
LZ77/LZ78/Huffman はすべて、テキストに限定されない一般的な圧縮アルゴリズムです。
C++ の話に戻りますが、C++ では、何かのサイズがコンパイル時に分かる必要があります (スタックに割り当てられるメモリはコンパイラによって決定されます)。しかし、入力テキストは実行時にのみ分かるため、理論的には良い方法はありません。文字セットとテキスト エンコーディングは深い落とし穴なので、いきなりそこに飛び込むことはお勧めできません。
ビット単位で演算を行いたい場合は、自分でライブラリをカプセル化するか、boostなどのライブラリが利用可能です。結局のところ、CPU の最小値は 1 バイトですが、その中のすべてのビットしか操作できません。