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 循环之一的下限。我对 y 做类似的事情,对网格的最大边也做类似的事情。在您的代码中,这将在xPos + x < 0or 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 迭代到 max - 2 并具有未设置单元格的边界。如果正在评估的单元格打开,您也应该减去 1。

这可能最终会比您拥有的要慢。您可以通过将位图存储在 int32s(或任何本机)中来进一步优化它。你也可以使用多线程,或者只实现Hashlife :)

显然,这优化了简洁性可读性。我认为您的代码具有最大的可读性。

正如 Jeffrey 所暗示的,存储一个稀疏的“on”布尔值数组可能比值数组更可取,这取决于你在做什么。

于 2012-05-29T22:53:20.997 回答