如何使用模运算符递增和递减整数
How can I increment and decrement an integer with the modulo operator
我正在尝试根据点击增加一个整数。点击如何发生并不重要,所以我会坚持逻辑。我在 Java 中这样做,但逻辑应该完全相同。
int index = 0;
// then within the click event
//arrySize holds the size() of an ArrayList which is 10
index = (index + 1) % arrySize;
按照这个逻辑,用户每点击一次,index
就会加1。然后它对arrySize
取模导致index
在[=11=时回到0 ] 匹配 arrySize
(10 % 10 会使索引回到 0) 这很好,因为它有点像从 0 到 10 然后回到 0 的循环,永远不会超过 10.
我正在尝试执行相同的逻辑,但向后
根据点击,数字将减少并变为 0 然后
回到 arrySize
而不是 -1
我怎样才能实现这个逻辑?
(index + arraySize - 1) % arraySize
做你想做的。
从Java8开始,可以使用Math.floorMod(x, y)
方法。引用其 Javadoc(强调我的):
The floor modulus is x - (floorDiv(x, y) * y)
, has the same sign as the divisor y
, and is in the range of -abs(y) < r < +abs(y)
.
System.out.println(Math.floorMod(-1, 5)); // prints 4
所以你将拥有:
index = Math.floorMod(index - 1, arrySize);
你不能直接 -1 % 5
因为那会输出 -1
based on how the operator %
operates with negatives numbers.
index = arraySize - ((index + 1) % arrySize)
如果您想要基于 1 的索引,请使用此选项。例如,如果您想倒退到 1 是一月的月份。
int previous = ((index - 1 - arraySize) % arraySize) + arraySize
结果
index previous
1 12
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9
11 10
12 11
我正在尝试根据点击增加一个整数。点击如何发生并不重要,所以我会坚持逻辑。我在 Java 中这样做,但逻辑应该完全相同。
int index = 0;
// then within the click event
//arrySize holds the size() of an ArrayList which is 10
index = (index + 1) % arrySize;
按照这个逻辑,用户每点击一次,index
就会加1。然后它对arrySize
取模导致index
在[=11=时回到0 ] 匹配 arrySize
(10 % 10 会使索引回到 0) 这很好,因为它有点像从 0 到 10 然后回到 0 的循环,永远不会超过 10.
我正在尝试执行相同的逻辑,但向后
根据点击,数字将减少并变为 0 然后
回到 arrySize
而不是 -1
我怎样才能实现这个逻辑?
(index + arraySize - 1) % arraySize
做你想做的。
从Java8开始,可以使用Math.floorMod(x, y)
方法。引用其 Javadoc(强调我的):
The floor modulus is
x - (floorDiv(x, y) * y)
, has the same sign as the divisory
, and is in the range of-abs(y) < r < +abs(y)
.
System.out.println(Math.floorMod(-1, 5)); // prints 4
所以你将拥有:
index = Math.floorMod(index - 1, arrySize);
你不能直接 -1 % 5
因为那会输出 -1
based on how the operator %
operates with negatives numbers.
index = arraySize - ((index + 1) % arrySize)
如果您想要基于 1 的索引,请使用此选项。例如,如果您想倒退到 1 是一月的月份。
int previous = ((index - 1 - arraySize) % arraySize) + arraySize
结果
index previous
1 12
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9
11 10
12 11