我正在编写一个使用16x16网格物体的2D元胞自动机。对象存储在表示网格的多维数组中。要计算下一代的值,我需要检查周围单元格的状态(打开或关闭)。如果要检查的单元格位于网格的边缘,那么我想让方法环绕网格,
我使用下面的方法执行此操作,但使用模运算符遇到问题:
// Scan neighbours, find out how many are active
int findNeighbours(int x, int y) {
int count = 0;
for(int i = -1; i<1; i++) {
for(int j = -1; j<1; j++) {
// Grid size is 16
int xPos = (x+i)%gridSize;
int yPos = (y+j)%gridSize;
// Check state
if(grid[xPos][yPos].on == true) {
count++;
}
}
}
return count++;
}
问题是,我希望:
(-1) mod 16 = 15
相反,我得到:
(-1) mod 16 = -1
导致越界错误。
这里发生了什么?
答案 0 :(得分:1)
您可以将除数添加到被除数中,直到它为正数。一些例子说明了它的工作原理:
5 % 16 = 5
(5 + 16) % 16 = 5
(-1 + 16) % 16 = 15
我认为Andreas的评论解释了为什么Java会比我更好地评估%运算符,但希望这能解决你的问题。