問題タブ [boost-dynamic-bitset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
395 参照

c++ - boost::dynamic_bitset<> は、何があっても逆順で埋めます

74MB ファイルのすべてのビットを表す大規模なビットセットがあります。圧縮アルゴリズムを使用して、このビットセットの圧縮された文字列表現を作成しています。次に、その文字列を別の動的ビットセットに格納して、後で解凍できるようにする必要があります。私の問題は、文字列からビットセットをどのように埋めようとしても、常に逆の順序で埋められることです。

簡単にするために、圧縮された文字列が

出力動的ビットセットを埋める最初の試みは次のとおりです。

これを行うと、ビットセットは文字列の逆になります。

それで、私はこれを試しました:

そして、まったく同じ出力が得られます。次に、逆イテレータを使用してみましたが、これがどのように可能かはわかりませんが、まったく同じ方法でビットセットを埋めます:

ビットセットを適切な順序で満たす唯一の方法は、次のようにすることです。

これにより、出力ビットセットが適切な順序で埋められますが、他の方法を使用するよりも大幅に遅くなります (使用している文字列では 30 秒遅くなります)。また、std::reverse を使用して文字列を元に戻し、ビットセットを埋めることもできますが、これには多くの余分な時間がかかります。通常の順序で文字列の値を動的ビットセットに効率的に入力する方法はありますか? 逆に埋められている理由は理解していますが、ビットセットを使用して整数を表すのではなく、ファイルからのデータを保存するために使用しているため、順番に並べる必要があります。ただし、逆イテレータを使用しても同じ出力が生成される理由がわかりません。

編集出力とコードの関連部分のスクリーンショットを撮りました。圧縮された出力には、ビットセットの圧縮バージョンの最初の 6000 文字が文字列として格納されて表示されます。この文字列自体は問題ありません。赤の下線は、この文字列を bitset boost::dynamic_bitset 出力に格納するために使用している行です。次に、出力ビットセットの最初の 6000 文字を出力すると、それらは完全に異なります。「出力」ビットセットは参照パラメーターとしてこの関数に渡されますが、最初は空であることに注意してください。 出力

0 投票する
1 に答える
472 参照

c++ - boost::dynamic_bitset<> を使用して uint16_t のベクトルを埋める

ハフマン圧縮でファイルを圧縮するプログラムを作成しています。もともと、ファイルからバイトを格納するために uint8_t のベクトルを使用していましたが、パフォーマンスはひどいものでした (74 MB のファイルを解凍するのに 2 時間)。ファイルの値を表すために 16 ビット チャンクを使用することにしました。

もともと、私はこれを持っていました(入力ビットセットには5億2000万ビットが含まれています)

これはうまく機能し、ファイルの各バイトを表す 8 ビット整数でいっぱいのベクトルを埋めました。各ビットの頻度は、サイズ 256 の整数のベクトルに記録されます。これは恐ろしく実行されています。私のファイル内のこれらの整数の頻度は巨大であるため、文字列をデコードするには絶対に永遠にかかります. 16 ビット整数を使用し、周波数をサイズ 65536 のベクトルに格納した方がよいと考えました。「バイト」のベクトルを埋める試みは次のとおりです。

ここでの問題は、 to_block_range() 関数が一度に 16 バイトを取り出すのではなく、ビットセットから 8 ビットを取り出して 8 つのゼロで埋めていることです。

この方法で動的ビットセットから uint16_t のベクトルを埋める方法はありますか?

0 投票する
0 に答える
243 参照

c++ - boost::dynamic_bitset のブロックごとの C++ 変更ビット

boost::dynamic_butset 入力を持つファイルが 1 つあります。このファイルは、ブロックを 8 ビットのチャンクで格納します。次に、編集が許可されているファイル内の関数に渡されます。問題は、このビットセットのビットを 8 ビット整数ではなく 16 ビット整数のベクトルに格納する必要があることです。

私はこれを試しました

しかし、タイプが異なるため、一致する関数呼び出しはありません。この元のビットセットをベクトルに格納するにはどうすればよいですか? 私が使用している入力ビットセットは非常に大きいため、for ループを使用してすべてを移動することは問題外です。