답변:
음수가 아닌 정수에 대해 의미가 약간 다른 모듈러스 연산자 대신 나머지 연산자를 사용할 수 있습니다 %
. 정확한 예를 들면 다음과 같습니다.
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
이것은 하나의 라이너로 단순화 될 수 있습니다 :
isEven = (a % 2) == 0;
%
전에 평가 ==
내가 고개 전에 표현식이 동일한 지 어떤지를 명확 것, 그래서 (a%2)==0
나 a%(2==0)
. 부울이 정수와 같지 않은 Java에서는 그다지 중요하지 않다고 생각합니다.
다음은 최소 Java 코드로 의사 코드를 표현한 것입니다.
boolean isEven = a % 2 == 0;
이제 구성 요소로 나누겠습니다. Java의 모듈러스 연산자는 퍼센트 문자 (%)입니다. 따라서 int % int를 사용하면 다른 int를 반환합니다. double equals (==) 연산자는 int 쌍과 같은 값을 비교하는 데 사용되며 부울을 반환합니다. 그런 다음 부울 변수 'isEven'에 할당됩니다. 연산자 우선 순위에 따라 모듈러스는 비교 전에 평가됩니다.
다른 모든 사람들이 이미 답을 했으므로 약간의 컨텍스트를 추가하겠습니다. "모듈러스"연산자가 실제로 나머지 작업을 수행하고 있습니다. mod와 rem의 차이점은 미묘하지만 중요합니다.
(-1 mod 2)는 일반적으로 1을 제공합니다.보다 구체적으로 두 개의 정수 X와 Y가 주어지면 연산 (X mod Y)는 [0, Y) 범위의 값을 반환하는 경향이 있습니다. 다르게 말하면, X 및 Y의 모듈러스는 항상 0보다 크거나 같고 Y보다 작다.
"%"또는 rem 연산자를 사용하여 동일한 작업을 수행하면 X 값의 부호가 유지됩니다. X가 음수이면 범위 (-Y, 0)의 결과를 얻습니다 .X가 양수이면 [0, Y) 범위의 결과를 얻습니다.
이 미묘한 차이는 종종 중요하지 않습니다. 그러나 코드 질문으로 돌아가서 "균등성"을 해결하는 방법에는 여러 가지가 있습니다.
첫 번째 방법은 특히 장황하기 때문에 초보자에게 좋습니다.
// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
isEven = true
}
else
{
isEven = false
}
두 번째 방법은 언어를 더 잘 활용하고 더 간결한 코드로 이어집니다. (== 연산자는 부울을 반환한다는 것을 잊지 마십시오.)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
세 번째 방법은 완전성을위한 것이며 삼항 연산자를 사용합니다 . 삼항 연산자는 종종 매우 유용하지만이 경우에는 두 번째 접근 방식이 우수하다고 생각합니다.
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
네 번째이자 마지막 접근 방식은 정수 의 이진 표현에 대한 지식을 사용 하는 것입니다 . 최하위 비트가 0이면 숫자는 짝수입니다. 비트 및 연산자 (&)를 사용하여 확인할 수 있습니다 . 이 방법이 가장 빠르지 만 (분할 대신 간단한 비트 마스킹을 수행하고 있음), 초보자에게는 조금 어려울 수 있습니다.
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
여기서는 비트 단위 및 연산자를 사용하여 옵션 2에 표시된 간결한 형식으로 표시했습니다. 옵션 1의 형식 (및 옵션 3의 형식)으로 다시 작성하는 것은 독자에게 연습으로 남겨 둡니다. ;)
희망이 도움이됩니다.
음의 X 및 양의 Y 값에 대해 MOD처럼 작동하도록 Java의 % (REM) 연산을 얻으려면이 방법을 사용할 수 있습니다.
private int mod(int x, int y)
{
int result = x % y;
if (result < 0)
{
result += y;
}
return result;
}
또는 삼항 연산자를 사용하는 경우 (일부 상황에서는 짧지 만 가능하지 않거나 덜 효율적 임) :
private int mod(int x, int y)
{
int result = x % y;
return result < 0? result + y : result;
}
Java에는 실제로 C와 같은 모듈로 연산자가 없습니다. Java에서 %는 나머지 연산자입니다. 양의 정수에서는 모듈로와 동일하게 작동하지만 음의 정수에서는 다르게 작동하며 모듈로와 달리 부동 소수점 숫자에서도 작동 할 수 있습니다. 여전히 양의 정수 이외의 값에는 %를 사용하는 경우가 드물기 때문에 모듈러스라고 부르려면 자유롭게 느끼십시오!
array[x mod array.length]
항상 음수 위치를 색인화하지 않고 배열의 요소에 액세스해야합니다.
(x % y + y) % y
또는 Java 8에서 시작Math.floorMod(x, y)
값이 음수인지 확인하여 적절한 모듈로를 수행하고 값이 많은 경우 수정하는 것이 가능하지만 (많은 방법이 제안한 방법) 더 컴팩트 한 솔루션이 있습니다.
(a % b + b) % b
먼저 모듈러스를 수행하여 값을 -b-> + b 범위로 제한 한 다음 b를 추가하여 값이 양수인지 확인하고 다음 모듈러스가 0-> b 범위로 제한하도록합니다.
참고 : b가 음수이면 결과도 음수입니다.
모듈러스를 사용하지 않고 코드가 훨씬 빠르게 실행됩니다.
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
'remainder'연산자 %를 사용하기 전에 사양을 검토해야합니다.
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
num %= 10;
if(num == 1)
return false;
else if(num == 0)
return true;
else
return isEven(num + 2);
}
isEven = isEven(a);
Java에서 %
연산자
는 15.17.3입니다. 나머지 연산자 %
또한이 있습니다 floorMod
에서 java.lang.Math
와 다른 결과를 줄 것이다 클래스 %
다른 징후와 인수를 :
%
는 인수가 음수 일 때도 제대로 작동하는 것보다 더 나은 '모듈러스'연산자이기 때문에 상향 조정 되었습니다. 다른 대답은 인수가 긍정적이 아닌 한 %가 실제로 모듈로가 아니라는 면책 조항과 함께 제공되므로 실제로 올바른 것은 없습니다. 특히 모든 정수를 배열의 연속 위치에 매핑하려는 array[floorMod(i, array.length)
경우 인덱스 i
가 음수 영역에 들어가 더라도 올바르게 작동합니다 . 그렇지 않습니다 %
.
또한 mod는 다음과 같이 사용될 수 있습니다 :
int a = 7;
b = a % 2;
b
1과 같을 것 7 % 2 = 1
입니다.
다른 사람들이 지적했듯이, %
(나머지) 연산자는 수학 mod
계수 연산 / 기능 과 동일하지 않습니다
.
mod
vs%
이
x mod n
함수 는의 범위에 매핑x
됩니다 . 반면 연산자 는의 범위에 매핑 됩니다 .n
[0,n)
x % n
x
n
(-n,n)
수학 계수 연산을 사용하고 앞에 부호를 신경 쓰지 않는 방법을 사용하려면 다음을 사용할 x
수 있습니다.
((x % n) + n) % n
어쩌면이 그림은 더 잘 이해하는 데 도움이 될 것입니다 (처음으로 머리를 감싸는 데 어려움을 겪었습니다)
int
변수 자체 의 2 ^ 32 모듈성을 고려하지 않습니다 . 이 floorMod
방법은 올바르게 수행하지만 n
음수 이면 추가 계산이 필요할 수 있습니다 .
이어 Java
상기 모드 동작 등을 수행 할 수있다 :
Math.floorMod(a, b)
참고 : 모드 동작은 다른 나머지 작업. 에서 Java
의 나머지 작업은 같은 수행 할 수 있습니다 :
a % b
Math.floorMod()
에는 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).
다음과 같은 것이 있습니다. 따라서 수학 계수와 정확히 같은 것은 아닙니다. 그러나 동일한 방법의 Javadoc에서도 긍정적 인 결과를 얻을 수있는 방법이 있습니다.If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorMod
작업이 예상대로 작동합니다. 또한이 floorMod
에 대한 long
가치와 그렇지 않은 경우가 BigInteger
더 큰 값.
@Cody의 코드 대안 :
모듈러스 연산자 사용 :
bool isEven = (a % 2) == 0;
중복 및 사용되지 않는 유연성이 적기 때문에 if / else를 작성하는 것보다 약간 더 나은 코드라고 생각합니다. 검사하는 데 약간의 두뇌 능력이 필요하지만 좋은 이름은 isEven
보상합니다.