0
A) int a[][]=new int[20][32];
   a[2][3]=1;
   if(a[2][3]==1)
   {
    System.out.println("true");
   }
B) int a[]=new int[20];
   a[2]=12;
   if ((a[2] & (1 << 3)) != 0)
   {
    System.out.println("true");
   }

A) 2D int array を使用しています。[2,3] が 1 であるかどうかを確認してい
ます。B) Int のインデックスを 2 番目の次元として使用しています。ここでは、配列の 2 番目の要素の 3 ビットをチェックしています。どちらの方がよいですか?そして、なぜスピードとメモリのコンテキストで?

4

2 に答える 2

1

ビットのテストは、小さい次元の単純な int のテストよりも時間がかかる場合があります。ただし、より大きな次元の場合は、それだけの価値があります。2 番目の例では、約 32 分の 1 のメモリしか使用しません (配列オブジェクトのオーバーヘッドを無視します)。これは、より多くのメモリがキャッシュに保持されることを意味し、メインよりもはるかに高速です。メモリ (CPU に比べて非常に遅い)。今日のマシンでは、多くの場合、キャッシュをより有効に使用できるように、より多くの命令を使用すると処理が大幅に高速化されますが、最初から全体が小さい場合、ビットをテストするオーバーヘッドはおそらく価値がないでしょう。

2 番目の例のように「小さなビット配列」を使用すると、非常にうまく機能する別のケースがありますint。ビットに個別にアクセスする代わりに、ビット配列が であるという事実を利用できる場合です。たとえば、一度に 32 ビット チャンク全体に対してブール演算を実行する場合、または 1 の数をカウントする場合、または 1 を持つ最小のインデックスを取得する場合 (特に本当にマスクが必要な場合)インデックスの代わりに)。

于 2013-10-02T17:35:31.537 に答える