Java의 계수를 음수로 동작시키는 가장 좋은 방법은?
할 때 자바에서
a % b
a가 음수일 경우 음수 결과를 반환하고 b로 반환해야 합니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까?내가 생각할 수 있는 유일한 방법은
a < 0 ? b + a : a % b
이 값은 % b = a - a / b * b처럼 동작합니다. 즉, 나머지가 됩니다.
(a % b + b) % b 할 수 있습니다.
이 표현은 의 결과로서 기능합니다.(a % b)
반드시 보다 낮다b
어떤 경우에도a
긍정 또는 부정입니다.추가 중b
부정적인 가치관을 배려하다a
,부터(a % b)
사이의 음의 값입니다.-b
그리고.0
,(a % b + b)
반드시 보다 낮다b
긍정적입니다.마지막 모듈로는 혹시 모르니까a
처음부터 긍정적이었어요.a
긍정적이다(a % b + b)
보다 커질 것이다b
.그러므로,(a % b + b) % b
보다 작게 하다b
(부정적인 영향을 주지 않음)a
값)을 참조해 주세요.
Java 8에서는 Math.floorMod(int x, int y) 및 Math.floorMod(long x, long y)를 사용할 수 있습니다.두 방법 모두 피터의 답변과 동일한 결과를 반환합니다.
Math.floorMod( 2, 3) = 2
Math.floorMod(-2, 3) = 1
Math.floorMod( 2, -3) = -1
Math.floorMod(-2, -3) = -2
아직 Java 8을 사용하지 않는(또는 사용할 수 없는) 사람들을 위해 Guava 11.0 이후 이용 가능한 IntMath.mod()를 사용하여 구했다.
IntMath.mod( 2, 3) = 2
IntMath.mod(-2, 3) = 1
주의사항: Java 8의 Math.floor Mod()와 달리 제수(두 번째 파라미터)는 음수일 수 없습니다.
수론에서 결과는 항상 긍정적이다.모든 프로그래머가 수학자는 아니기 때문에 컴퓨터 언어에서는 항상 그렇지는 않다고 생각합니다.제 의견으로는 언어의 디자인 결함이라고 생각합니다만, 지금은 변경할 수 없습니다.
= MOD(-4,180) = 176 = MOD(176,180) = 176
왜냐하면 180 * (-1) + 176 = -4는 180 * 0 + 176 = 176과 같기 때문이다.
http://mathworld.wolfram.com/Congruence.html 의 클럭의 예에서는, duration_of_time mod cycle_length 가 -45 분이라고 하는 것이 아니고, 15 분이라고 하는 것이 됩니다.단, 두 응답 모두 기본 방정식을 만족시킵니다.
Java 8에는Math.floorMod
단, 매우 느립니다(실장에는 복수의 분할, 곱셈 및 조건이 있습니다).그러나 JVM에 최적화된 스터브가 내장되어 있어 속도가 크게 향상될 수 있습니다.
이 작업을 수행하는 가장 빠른 방법은floorMod
다른 , 것은 입니다.%
op.
n이 양수이고 x가 무엇이든 될 수 있다고 가정합니다.
int remainder = (x % n); // may be negative if x is negative
//if remainder is negative, adds n, otherwise adds 0
return ((remainder >> 31) & n) + remainder;
:n = 3
:
x | result
----------
-4| 2
-3| 0
-2| 1
-1| 2
0| 0
1| 1
2| 2
3| 0
4| 1
다음 사이의 균일한 분포만 필요한 경우0
★★★★★★★★★★★★★★★★★」n-1
연산자가 mod 연산자.x
는 는 ' ' 근처에 군집하지 않는다.0
, 병렬화, 느린 병렬화 등이 있기 에, 더 %
계산은 결과에 의존하지 않기 때문에 다른 부분과 병렬로 이루어집니다.
return ((x >> 31) & (n - 1)) + (x % n)
의 결과에는 「」가 .n = 3
:
x | result
----------
-5| 0
-4| 1
-3| 2
-2| 0
-1| 1
0| 0
1| 1
2| 2
3| 0
4| 1
5| 2
입력이 int의 전체 범위에서 랜덤일 경우 두 솔루션의 분포는 동일합니다.0에 .n - 1
후자의 용액에서.
대체 방법은 다음과 같습니다.
a < 0 ? b-1 - (-a-1) % b : a % b
이것은 다른 공식 [(% b + b) % b]보다 빠르거나 빠르지 않을 수 있다.다른 공식과 달리 분기를 포함하지만 하나 적은 모듈로 연산을 사용합니다.컴퓨터가 < 0을 올바르게 예측할 수 있다면 아마 성공입니다.
(편집: 수식을 수정했습니다.)
언급URL : https://stackoverflow.com/questions/4412179/best-way-to-make-javas-modulus-behave-like-it-should-with-negative-numbers
'programing' 카테고리의 다른 글
Python에서 문자열 서브스트링을 가져오려면 어떻게 해야 하나요? (0) | 2022.09.04 |
---|---|
어느 쪽이 더 효율적인가:MySQL 테이블이 여러 개입니까, 아니면 하나의 큰 테이블입니까? (0) | 2022.09.04 |
Postgres에서 MySQL로 데이터베이스 마이그레이션 (0) | 2022.09.04 |
boto3 클라이언트 NoRegionError:지역 오류는 가끔만 지정해야 합니다. (0) | 2022.09.04 |
Java에서는 클래스 내부의 열거형은 정적입니까? (0) | 2022.09.03 |