7

配列がすべて 0 (または false) の場合、すべての単一の値を反復/ループせずに、同じサイズの新しい配列を割り当てずに (を使用してmemcmp) C(++) でチェックできますか?

ブール値の配列を悪用して、実行時に任意の大きなビットセットを持ち、ビットフリップを実行しています

4

8 に答える 8

7

次の条件を使用できます。

(myvector.end() == std::find(myvector.begin(), myvector.end(), true))

明らかに、内部的に、これはすべての値をループします。

true別の方法 (実際にはループを回避する必要があります) は、すべての書き込みアクセス関数をオーバーライドし、ベクターに書き込まれたことがあるかどうかを追跡することです。

アップデート

以下の Lie Ryan のコメントは、同じ原則に基づいて、これを行うためのより堅牢な方法を説明しています。

于 2010-10-28T15:48:09.887 に答える
2

ソートされていない場合は、いいえ。それをどのように達成する予定ですか?すべての要素を検査して、0 かどうかを確認する必要があります。もちろん、memcmp もすべての要素をチェックします。別の配列も読み取るため、はるかに高価になります。

もちろん、0 以外の要素にヒットするとすぐにアーリーアウトできます。

唯一のオプションは SIMD を使用することです (技術的にはすべての要素をチェックしますが、使用する命令は少なくなります) が、通常はジェネリック配列では使用しません。

(ところで、私の答えは、単純な静的 C/C++ 配列があることを前提としています。配列の種類を指定できる場合は、より具体的にすることができます。)

于 2010-10-28T15:48:43.547 に答える
1

boost::dynamic_bitset代わりに使用することを検討してください。これにはnoneメンバーとその他のいくつかのstd::bitset操作がありますが、その長さは実行時に設定できます。

于 2010-10-28T15:59:47.960 に答える
1

N 要素の配列があると仮定すると、一連の基本ベクトルに対してビット チェックを実行できます。

たとえば、テストする 15 要素の配列があるとします。

8 要素のゼロ配列、4 要素のゼロ配列、2 要素のゼロ配列、および 1 要素のゼロ配列に対してテストできます。

テストする配列の最大サイズがわかっている場合は、これらの要素を一度だけ割り当てる必要があります。さらに、テストは並行して実行できます (必要に応じてアセンブリ組み込みを使用して)。

4 要素のゼロ配列は 8 要素のゼロ配列の前半にすぎないため、8 要素の配列のみを使用することで、メモリ割り当てに関してさらに改善することができます。

于 2010-10-28T16:29:17.247 に答える
1

これが要件になることがわかっている場合は、配列 (おそらく動的) とカウントまたは現在ゼロ以外のセルで構成されるデータ構造を構築できます。明らかに、セルの設定は抽象化する必要がありますが、オーバーロードを使用する c++ では当然のことであり、c では不透明型を使用できます。

于 2010-10-28T15:52:01.083 に答える
0

ニット、

ターゲットコンピューター上のいくつかの派手なDMAハードウェアにアクセスできるとは思いませんか?DMAハードウェアは、必要な操作を正確にサポートする場合があります。つまり、「メモリのこの領域はすべてゼロですか?」この種のハードウェアアクセラレーションによる比較は、大きなビットバッファを処理する場合の一般的なソリューションです。たとえば、一部のRAIDコントローラは、パリティチェックにこのメカニズムを使用します。

于 2010-10-28T19:04:33.793 に答える
0

いいえ、配列を と比較することはできmemcmpますが、1 つの値をメモリ ブロックと比較することはできません。

できることは、C++ でアルゴリズムを使用することですが、それでも内部的にループが含まれます。

于 2010-10-28T15:49:14.130 に答える
0

全体を反復処理する必要はありません。ゼロ以外の最初の値でループを停止するだけです。

一連の値を順番に検査する以外に、一連の値をチェックする方法は考えられません。基礎となるメモリをbool__int64たとえば)より大きいものとしてチェックしてゲームをプレイできますが、アライメントが問題になります。

編集:設定されたビットの個別のカウントを保持し、それがゼロ以外であることを確認できます。これのメンテナンスには注意が必要です。そのため、セット ビットを設定することはできませんでし++た。

于 2010-10-28T15:49:59.033 に答える