3

ブール値を数字のように足し合わせることができるかどうか疑問に思いました。グリッドを使用したものを作成していますが、周囲の正方形を見つけて数値を返したいと思っています。編集:これは私がブール値で数える方法です。

 int count = 0;
 for (int x = -1; x<=1;x++){
   for (int y = -1; y <=1;y++){
     if (grid[xPos+x][yPos+y]){
        count++;
     }
   }
 }
4

3 に答える 3

8
boolean[] bools = ...
int sum = 0;
for(boolean b : bools) {
    sum += b ? 1 : 0;
}

trueこれは、あなたがなりたい、なりたいと思っていることを前提として1falseます0

于 2012-05-29T22:31:05.847 に答える
1

ジェフリーの答えに追加するには、次のことを忘れないでください。

  • ネストされたforループの中央のセルにいる場合は、グリッドをチェックしたり、カウントに追加したりしないでください。それ以外の場合は、セル自体を隣接セルでカウントしています。あなたの状況では、(x == 0 && y == 0)
  • セルが端にあるかどうかを確認する必要があります。端にある場合は、グリッドから外れているセルをカウントしようとしていないことを確認してください。私は次のようなものを使用してこれを行いました:int xMin = Math.max(cellX - 1, 0);ここで、xMinはforループの1つの下限です。yについても同様で、グリッドの最大側についても同様です。コードでは、これはxPos + x < 0またはxPos + x >= MAX_X(MAX_Xはグリッドに許可されている最大x値の定数)の場合に発生し、y側でも同様です。
于 2012-05-29T22:46:45.147 に答える
0

あなたの目標は何ですか?スピード?読みやすさ?コードの簡潔さ?

速度を求めている場合は、メモリアクセスの数を最小限に抑えることを検討してください。ブール値をビットとして強制的に格納できる場合は、>>および&を使用して、各行で気になるビットのみを比較できます。多分このようなもの:

 byte grid[m][n / 8];

 int neighbor_count = 0;
 for (int row = yPos - 1; row < yPos + 1; row++) {
   // calculate how much to shift the bits over.
   int shift = 5 - (xPos - 1 % 8);
   if (shift > 0) {
     // exercise for the reader - span bytes.
   } else {
     // map value of on-bits to count of on bits
     static byte count[8] = [0, 1, 1, 2, 1, 2, 2, 3];
     // ensure that only the lowest 3 bits are on.
     low3 = (grid[row][xPos / 8] >> shift) & 7;
     // look up value in map
     neighbor_count += count[low3];
   }

警告コーダー:これはテストされておらず、説明のみを目的としています。また、境界チェックも含まれていません。これを回避するには、1から最大-2まで繰り返し、未設定のセルの境界を設定します。また、評価対象のセルがオンの場合は、1を引く必要があります。

これはあなたが持っているものより遅くなるかもしれません。ビットマップをint32s(またはネイティブのもの)に保存することで、さらに最適化できます。マルチスレッドを使用することも、Hashlifeを実装することもできます:)

明らかに、これは簡潔さと読みやすさから離れて最適化します。私はあなたがあなたのコードで最大の可読性を持っていると思います。

Jeffreyがほのめかしているように、実行している内容によっては、値の配列よりも'on'ブール値のスパース配列を格納する方が望ましい場合があります。

于 2012-05-29T22:53:20.997 に答える