본문 바로가기
TIL

[자바] Math.floorDiv & Math.floorMod

Baspo8 2024. 5. 11.

내용

"음수 % 양수" 의 값이 음수로 나와 양수로 바꿔줄 필요가 있었다.

Math클래스의 floorMod라는 연산을 찾았다.

public static int floorMod(int x, int y) {
    return x - floorDiv(x, y) * y;
}

floorMod를 타고 들어가보니 floorDiv에 대해 먼저 알아야 했다.

 

public static int floorDiv(int x, int y) {
    int r = x / y;
    // if the signs are different and modulo not zero, round down
    if ((x ^ y) < 0 && (r * y != x)) {
        r--;
    }
    return r;
}

floorDiv는 "x / y"의 몫을 구하는데 x와 y의 부호가 다를 경우 처리하는 로직이 여기에 있다.

 

`(x ^ y) < 0`가 두 수의 부호가 다른 것을 판단한다.

숫자를 이진수로 나타냈을 때 최상위 비트가 1이면 음수, 0이면 양수이다.

따라서, XOR연산으로 부호가 다름을 표현할 수 있다.

floorDiv에서 x와 y의 부호가 다를 경우 몫에 1을 뺀 값을 반환한다.

따라서 floorDiv에서도 양수인 나머지를 구할 수 있다.