0

文字を含むベクトルがあります。これらの文字はアルファベットの大文字 26 文字のみであるため、これらの文字を表すビット数を 8 から 5 に減らすことができます。次に、後で使用するために結果をファイルに書き込む必要があります。

私の現在の考えでは、A..Z の最上位 3 ビットはすべて同じなので、最下位 5 ビットを使用して文字を一意に識別できますか? ただし、このフォーマットされていないデータをファイルに書き込むのに苦労しています。

これを実行して結果をファイルに書き込むにはどうすればよいですか?

4

5 に答える 5

1

文字を 5 ビットに減らすには、ch & 0x1Fまたはch - 'A';のいずれかを使用できます。どちらも EBCDIC では動作しませんが、おそらく問題にはなりません。(そうである場合: インデックスを返す、すべての大文字の文字列でのテーブル ルックアップを使用できます。)

その後、複雑になります。最も簡単な解決策は、次のようなビット配列を定義することです。

class BitArray
{
    std::vector<unsigned char> myData;
    int byteIndex( int index ) { return index / 8; }
    unsigned char bitMask( int index ) { return 1 << (index % 8); }
    int byteCount( int bitCount )
    { 
        return byteIndex( bitCount )
            + (bitIndex( bitCount) != 0 ? 1 : 0);
    }
public:
    BitArray( int size ) : myData( byteCount( size ) ) {}
    void set( index )
    {
        myData[byteIndex( index )] |= bitMask( index );
    }
    void reset( index )
    {
        myData[byteIndex( index )] &= ~bitMask( index );
    }
    bool test( index )
    {
        return (myData[byteIndex( index ) & bitMask( index )) != 0;
    }
};

(データを抽出するにはさらに必要になりますが、必要な形式はわかりません。)

次に、文字列をループします。

BitArray results( 5 * s.size() );
for ( int index = 0; index != s.size(); ++ index ) {
    for ( int pos = 0; pos != 5; ++ pos ) {
        results.set( 5 * index + pos );
    }
}

これは問題なく動作します。私が遠い過去にそれ(または同等のもの)を使用しようとしたとき(これは1980年代だったので、Cでのハフマンエンコーディング用)、それも遅すぎました。ひもがかなり短い場合は、今日、それで十分かもしれません。それ以外の場合は、最後のバイトで既に使用されているビット数を追跡​​し、適切なシフトとマスクを実行して、一度にできるだけ多くのビットを挿入する、より複雑なアルゴリズムが必要になります。最大 2 つのシフトまたはここの場合のように 5 回ではなく、挿入あたりの操作数です。これが私が最終的に使用したものです。(しかし、私はもうコードを持っていないので、例を簡単に投稿することはできません.)

于 2014-05-01T08:37:49.247 に答える
0

処理できるデータの最小単位は 8 ビットです。ビット シフトを使用する必要がありますが、データの読み取り/書き込みは 8 ビットのグループでしかできないため、それを処理するには追加のロジックが必要になります。入力に少なくとも 8 つの 5 ビット文字が含まれている場合は、一度に 8 文字をマージして合計 40 ビットにし、それを 5 つの 8 ビット バイトとしてファイルに書き出します。残りの 5 ビット文字が 8 個未満になるまで必要に応じて続行し、それらをマージして、残りを 8 の偶数倍になるようにパディングし、それをファイルに書き出します。

于 2014-04-30T17:54:13.050 に答える
0

それできますか?もちろん。

gzip を使用して圧縮ファイルを書き込むだけで、より成功し、簡単になると思います。

于 2014-04-30T18:25:29.360 に答える
0

アルファベットの大文字 26 文字のみの [文字の] ベクトルがあります

比較的簡単にコーディングできます。テキストを 8 文字のブロックに分割し、エンコードされたテキストを次のように 5 バイトのブロックに書き込みます。

          76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210
ORIGINAL: 000AAAAA 000BBBBB 000CCCCC 000DDDDD 000EEEEE 000FFFFF 000GGGGG 000HHHHH

          76543210 76543210 76543210 76543210 76543210
ENCODED:  AAAAABBB BBCCCCCD DDDDEEEE EFFFFFGG GGGHHHHH

最後のブロックに十分な文字がない場合は、26 文字のエンコードに使用されていない「パッド」文字 (すべて 1) を使用してください。

于 2014-04-30T18:14:31.473 に答える