[자바] Math.floorDiv & Math.floorMod
Math.floorDiv & Math.floorMod
Math.floorDiv & Math.floorMod
내용
“음수 % 양수” 의 값이 음수로 나와 양수로 바꿔줄 필요가 있었다.
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에서도 양수인 나머지를 구할 수 있다.