我想知道我是否可以添加像数字一样的布尔值。我正在制作使用网格的东西,我想让它找到周围的方块并返回一个数字。 编辑: 这就是我对布尔人的看法。
int count = 0;
for (int x = -1; x<=1;x++){
for (int y = -1; y <=1;y++){
if (grid[xPos+x][yPos+y]){
count++;
}
}
}
答案 0 :(得分:7)
boolean[] bools = ...
int sum = 0;
for(boolean b : bools) {
sum += b ? 1 : 0;
}
这假定您希望true
1
和false
为0
。
答案 1 :(得分:1)
要添加杰弗里的回答,请不要忘记:
(x == 0 && y == 0)
int xMin = Math.max(cellX - 1, 0);
其中xMin是其中一个for循环的下限。我对y做的类似,对于网格的最大边也类似。在您的代码中,这将在xPos + x < 0
或xPos + x >= MAX_X
(MAX_X是网格允许的最大x值的常量)时发生,并且类似于y方面。答案 2 :(得分:0)
你的目标是什么?速度?可读性?代码简洁?
如果您正在寻求速度,请考虑尽量减少内存访问次数。如果您可以强制将布尔值存储为位,则可以使用&gt;&gt;和&amp;仅比较每行中您关注的位数。也许是这样的:
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:)
显然,这可以优化简洁性和的可读性。我认为你的代码具有最大的可读性。
正如杰弗里提到的那样,存储稀疏数组的'on'布尔值可能比一组值更可取,这取决于你正在做什么。