Java에서 mod의 구문은 무엇입니까


231

의사 코드의 예 :

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

답변:


357

음수가 아닌 정수에 대해 의미가 약간 다른 모듈러스 연산자 대신 나머지 연산자를 사용할 수 있습니다 %. 정확한 예를 들면 다음과 같습니다.

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

이것은 하나의 라이너로 단순화 될 수 있습니다 :

isEven = (a % 2) == 0;

80
if / else가 불필요하다면 isEven = (a % 2) == 0을 사용하십시오
Steve Kuo

59
n (mod m)이 항상> = 0이지만 n % m이 아니기 때문에 mod 및 모듈 식이라는 용어에주의하십시오. n % m의 범위는> -m 및 <m입니다. Java에는 int 및 long 유형에 대한 나머지 연산자가 있지만 모듈러스 함수 또는 연산자는 없습니다. 즉, -12 % 10 = -2 인 반면 -12 mod 10 = 8입니다. % 연산자가 n % m에 대해 음수 값을 반환하면 (n % m) + m은 n mod m을 나타냅니다. BigInteger는 둘 다에 대한 기능을 제공하며 차이점을 잘 설명하는 사양입니다. 또한 0으로 조심하십시오. 수학에서 0은 짝수이지만 양수 또는 음수가 아닙니다.
Jim

4
@ nl-x 아마도 우선권을 관례에 맡기는 것보다 우선 순위를 명시하는 것이 낫기 때문일 것입니다. 하나 나는 몰랐 %전에 평가 ==내가 고개 전에 표현식이 동일한 지 어떤지를 명확 것, 그래서 (a%2)==0a%(2==0). 부울이 정수와 같지 않은 Java에서는 그다지 중요하지 않다고 생각합니다.
Matthew Sainsbury

8
이것은 계수 연산자가 아닙니다. 나머지 연산자입니다. 게시물을 수정하십시오!
Kieren Johnstone

2
부울 짝수 = ((a & 1) == 0). 훨씬 쉽게.
mdev

111

다음은 최소 Java 코드로 의사 코드를 표현한 것입니다.

boolean isEven = a % 2 == 0;

이제 구성 요소로 나누겠습니다. Java의 모듈러스 연산자는 퍼센트 문자 (%)입니다. 따라서 int % int를 사용하면 다른 int를 반환합니다. double equals (==) 연산자는 int 쌍과 같은 값을 비교하는 데 사용되며 부울을 반환합니다. 그런 다음 부울 변수 'isEven'에 할당됩니다. 연산자 우선 순위에 따라 모듈러스는 비교 전에 평가됩니다.


12
최소한 괄호가 없을 것이다;)
pstanton

3
모듈러스 연산자가 아닌 나머지 연산자입니다.
Lorne의 후작

@ user207421 이름은 실제로 나머지 연산자 이지만 " modulus – 4. (컴퓨팅, 프로그래밍) 두 숫자 사이에 배치 된 연산자로 나머지 숫자를 나눕니다."?
GeroldBroser는 Monica를

93

다른 모든 사람들이 이미 답을 했으므로 약간의 컨텍스트를 추가하겠습니다. "모듈러스"연산자가 실제로 나머지 작업을 수행하고 있습니다. 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의 형식)으로 다시 작성하는 것은 독자에게 연습으로 남겨 둡니다. ;)

희망이 도움이됩니다.


고마워 Rob. 이 혼동은 프로그래머에게 모듈 산술의 수학적 특성을 가진 알고리즘을 구현하는 방법을 설명하는 데 엄청난 어려움을 초래합니다. 나머지는 모듈러스가 아니지만 나머지 모듈에서 모듈러스를 빠르게 도출 할 수 있습니다.
Jim

1
@TickledPink Java로 컴파일되지 않는 것을 제외하고.
Eugene Beresovsky 1

33

음의 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;
}

12

Java에는 실제로 C와 같은 모듈로 연산자가 없습니다. Java에서 %는 나머지 연산자입니다. 양의 정수에서는 모듈로와 동일하게 작동하지만 음의 정수에서는 다르게 작동하며 모듈로와 달리 부동 소수점 숫자에서도 작동 할 수 있습니다. 여전히 양의 정수 이외의 값에는 %를 사용하는 경우가 드물기 때문에 모듈러스라고 부르려면 자유롭게 느끼십시오!


그러나 음수를 처리하는 실제 모듈로 연산자를 원하므로 array[x mod array.length]항상 음수 위치를 색인화하지 않고 배열의 요소에 액세스해야합니다.
Kris

2
(x % y + y) % y 또는 Java 8에서 시작Math.floorMod(x, y)
Greg Charles

12

값이 음수인지 확인하여 적절한 모듈로를 수행하고 값이 많은 경우 수정하는 것이 가능하지만 (많은 방법이 제안한 방법) 더 컴팩트 한 솔루션이 있습니다.

(a % b + b) % b

먼저 모듈러스를 수행하여 값을 -b-> + b 범위로 제한 한 다음 b를 추가하여 값이 양수인지 확인하고 다음 모듈러스가 0-> b 범위로 제한하도록합니다.

참고 : b가 음수이면 결과도 음수입니다.


a와 b가 모두 큰 경우 오버플로가 발생할 수 있으므로 올바른 해결책이 아닙니다.
Trixie Wolf

11

모듈러스를 사용하지 않고 코드가 훨씬 빠르게 실행됩니다.

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}

3
이것은 허용 된 답변보다 훨씬 깨끗해 보입니다. 이것은 조기 최적화와 관련이 없습니다. 작동하면 더 좋습니다.
AlexWien

4
@LluisMartinez 이것은 컴퓨팅에서 가장 잘못 인용되는 말 중 하나입니다. "프로그래머는 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 많은 시간을 낭비하며, 이러한 효율성에 대한 시도는 실제로 디버깅 및 유지 관리를 고려할 때 큰 부정적인 영향을 미칩니다. 효율성은 시간의 약 97 %라고 말합니다. 조기 최적화는 모든 악의 근원입니다. 그러나 우리는 그 중요한 3 %의 기회를 포기해서는 안됩니다. " 실제로는 상당히 다른 것을 의미합니다.
Lorne의 후작

3
@EJP 아마 당신 말이 맞을 것입니다. 나는 테스트를했다 (100 만 반복 루프)는 모듈로에서 4000 나노 초, 논리 및 2500 나노 초로 걸렸다.
Lluis Martinez

이것이 왜 대답이 될까요? 물론 홀수이지만 mod / remainder 연산자로 아무것도하지 않습니다. 이 질문은 홀수 짝수를 찾는 방법이 아니라 mod 연산자에 대해 이야기합니다.
마크 월시



4

Java에서 %연산자 는 15.17.3입니다. 나머지 연산자 %

또한이 있습니다 floorMod에서 java.lang.Math와 다른 결과를 줄 것이다 클래스 %다른 징후와 인수를 :

public static int floorMod​(int x, int y)


1
floorMod %는 인수가 음수 일 때도 제대로 작동하는 것보다 더 나은 '모듈러스'연산자이기 때문에 상향 조정 되었습니다. 다른 대답은 인수가 긍정적이 아닌 한 %가 실제로 모듈로가 아니라는 면책 조항과 함께 제공되므로 실제로 올바른 것은 없습니다. 특히 모든 정수를 배열의 연속 위치에 매핑하려는 array[floorMod(i, array.length)경우 인덱스 i가 음수 영역에 들어가 더라도 올바르게 작동합니다 . 그렇지 않습니다 %.
Kris

3

또한 mod는 다음과 같이 사용될 수 있습니다 :

int a = 7;
b = a % 2;

b1과 같을 것 7 % 2 = 1입니다.


초보자를위한 예제에서 출력없이 복합 연산자를 사용하는 것은 실수 일 수 있습니다.
Stu Thompson

3

Java의 나머지 연산자는 %다음과 같으며 모듈로 연산자는

public int mod(int i, int j)
{
  int rem = i % j;
  if (j < 0 && rem > 0)
  {
    return rem + j;
  }
  if (j > 0 && rem < 0)
  {
    return rem + j;
  }
  return rem;
}

2

다른 사람들이 지적했듯이, %(나머지) 연산자는 수학 mod계수 연산 / 기능 과 동일하지 않습니다 .

mod vs %

x mod n함수 는의 범위에 매핑 x됩니다 . 반면 연산자 는의 범위에 매핑 됩니다 .n[0,n)
x % nxn(-n,n)

수학 계수 연산을 사용하고 앞에 부호를 신경 쓰지 않는 방법을 사용하려면 다음을 사용할 x수 있습니다.

((x % n) + n) % n

어쩌면이 그림은 더 잘 이해하는 데 도움이 될 것입니다 (처음으로 머리를 감싸는 데 어려움을 겪었습니다)

여기에 이미지 설명을 입력하십시오


1
좋은 그림. 또 다른 복잡성 : int변수 자체 의 2 ^ 32 모듈성을 고려하지 않습니다 . 이 floorMod방법은 올바르게 수행하지만 n음수 이면 추가 계산이 필요할 수 있습니다 .
Maarten Bodewes

1

다른 방법은 다음과 같습니다.

boolean isEven = false;
if((a % 2) == 0)
{
    isEven = true;
}

그러나 가장 쉬운 방법은 여전히 ​​:

boolean isEven = (a % 2) == 0;

@Steve Kuo와 같이 말했다.


0

이어 Java상기 모드 동작 등을 수행 할 수있다 :

Math.floorMod(a, b)

참고 : 모드 동작은 다른 나머지 작업. 에서 Java나머지 작업은 같은 수행 할 수 있습니다 :

a % b

글쎄요, 정확히 ... javadoc 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).
WesternGun

@WesternGun 사실 일 수도 있지만 , 계수가 양수임을 알고 있으면floorMod 작업이 예상대로 작동합니다. 또한이 floorMod에 대한 long가치와 그렇지 않은 경우가 BigInteger더 큰 값.
22:41에 Maarten Bodewes

-1

모듈로 연산자는 % (퍼센트 부호)입니다. 균일 성을 테스트하거나 일반적으로 2의 거듭 제곱에 대해 모듈로를 수행하려면 isEven =! (a & 1)과 같은 & (및 연산자)를 사용할 수도 있습니다.


-3

@Cody의 코드 대안 :

모듈러스 연산자 사용 :

bool isEven = (a % 2) == 0;

중복 및 사용되지 않는 유연성이 적기 때문에 if / else를 작성하는 것보다 약간 더 나은 코드라고 생각합니다. 검사하는 데 약간의 두뇌 능력이 필요하지만 좋은 이름은 isEven보상합니다.


2
모듈러스 연산자가 아닌 나머지 연산자입니다.
Lorne의 후작

@EJP ok. 그렇다면 모듈러스 연산자는 무엇입니까?
TheRealChx101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.