Monday

Java 중간값 구하기 (오버플로우 실수없이) 본문

언어/Java 기타

Java 중간값 구하기 (오버플로우 실수없이)

뉴비2 2021. 3. 15. 22:22

중간값을 구할 때 흔히 하는 실수는 다음과 같습니다.

int start = 0;
int end = 10;

//중간값 구하기
int mid = (start + end) / 2; //숫자가 작을 때는 아무 문제 없음

위 코드는 start, end의 값이 작을 때는 아무 오류가 나지 않습니다. 그러나, 숫자가 커지면 (start + end)가 오버플로우 되면서 예상치 못한 값을 얻게 됩니다.

 

해결법

1) 작은 수 + (큰 수 - 작은 수) / 2

int start = 0;
int end = 10;

int mid = start + (end - start) / 2;

 

2) bit 연산자 >>> 사용 (결과가 양수일 때만 가능)

int start = 0;
int end = 10;

int mid = (start + end) >>> 1; // >>>는 최상위 부호 비트를 무조건 0으로 채움

※ >> 와 >>> 차이

>> 는 비트를 한 칸 이동시킬 때 최상위 부호 비트랑 똑같은 값으로 최상위 부호 비트를 채운다.

ex) 110(2진수) >> 1 = 111(2진수), 이전 최상위 부호 비트가 1이었으므로 이동 후 빈칸을 1로 채운다.

 

>>>는 최상위 부호 비트를 무조건 0으로 채운다.

ex) 110(2진수) >>> 1 = 011(2진수) 

Comments