Monday
Java 중간값 구하기 (오버플로우 실수없이) 본문
중간값을 구할 때 흔히 하는 실수는 다음과 같습니다.
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진수)
'언어 > Java 기타' 카테고리의 다른 글
자바 Exception 종류 (0) | 2021.06.12 |
---|---|
자바 JDBC 드라이버 연결 원리(Class.forName()) (0) | 2021.04.06 |
Java 생성자 분석 (바이트 코드) (0) | 2021.03.23 |
자바 Queue 함수 비교 (Null vs Exception) (0) | 2021.03.16 |
1주차 : JVM과 자바 코드 실행 원리 (0) | 2021.02.09 |
Comments