2012-05-29 40 views
2

我在想,如果计数我可以添加布尔像数字。我正在做一些使用网格的东西,我希望它找到周围的正方形并返回一个数字。 编辑: 这是我如何与布尔值。与布尔

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

你如何计算布尔值?举个例子,请 –

+3

这不是康威的生命游戏,是吗? –

+0

当x == 0和y == 0时,不要忘记不要计算中心位置,除非您确定要这样做。另外,您是否需要检查x <0或y的边缘条件?是否最大X或Y>最大Y? –

回答

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

这是假设你想true1false0

+0

@HovercraftFullOfEels这是,但我正在修改它,以便人们可以调整规则。 – Barakados

1

为了增加杰弗里的回答,不要忘记:

  • 如果你嵌套的for循环的中心细胞,不检查网格,不加算。否则你正在计算邻居数量的细胞本身。在您的情况,这是(x == 0 && y == 0)
  • 您需要检查小区的边缘,如果是确保你不是要算那些离开网格单元。我已经使用类似这样的方法完成了这个工作:int xMin = Math.max(cellX - 1, 0);其中xMin是for循环之一的下界。我为y做了类似的事情,并且类似于网格的最大边。在您的代码中,当xPos + x < 0xPos + x >= MAX_X(MAX_X是网格允许的最大x值的常量)时,会发生这种情况,并且y方面的情况类似。
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'布尔值数组可能比数组值更可取,这取决于你在做什么。