티스토리 뷰

CS/Java

자바의 <<, >>, >>>와 그의 활용

기억용블로그 2022. 9. 6. 19:57
728x90

비트연산자

자바에서 <<, >>, >>>는 비트연산자 기호이다.

비트연산자란 char, byte, short, int, long 등과 같은 자료형에서 해당 값을 비트로서 연산하는 기능을 수행한다.

 

비트연산자의 개념에 대해 다루려는 것이 아니므로 아래의 표만 첨부한다.

 

 

비트연산자 <<, >>, >>>의 활용

 

<<

HashMap 내부 구현체에서 아래와 같은 비트연산자 <<를 사용하여 표현하였다.

a << b는 a를 비트로 표현된 값의 우측에 b개의 비트 0을 붙여달라는 의미이다.

 

 

1을 비트로 표현하면 1이고 4개의 0을 붙이면 10000이며 이를 정수로 표현하면 16이 된다. 

(int) Math.pow(2, 4)와 동일한 값을 표현한다.

 

그러면 다른 방법도 많은데 왜 굳이 비트연산자를 이용해서 표현하는 것일까?

 

가장 먼저 비트연산자는 속도가 빠르다. AND, OR, SHIFT와 같이 로우레벨로 표현된 비트를 직접 다루는 비트연산은 비트연산의 조합으로 만들어지는 산술연산보다 더 빠른 성능을 가질 수 밖에 없다.

 

하지만 위와 같이 1 << 4로 명시적으로 표기한 이유는 성능보다는 해당 값이 2의 배수여야 함을 강조하는 것이다.

 

2의 배수여야 하는 것은 HashMap의 getNode()와 같은 메서드에서 & 연산을 통해 객체가 어떤 버킷에 저장되어있는지 선택할 수 있어야 하기 때문이다.

 

 

결론 : <<은 2의 배수를 손쉽게 표현하는데 활용할 수 있다.

 

 

>>>와 >>

>>은 <<와 정반대로 2로 나눠야 할때 활용할 수 있다.

 

 

위의 int mid = (low + high) >>> 1은 low + (high - low) / 2 와 같은 의미를 가진다.

만약 int mid = (low + high) >> 1 라고 사용했다면 (high + low) / 2 와 같은 의미를 가질 것이다.

 

>>>와 >>의 차이를 알아보기 전에 low + (high - low) / 2와 (high + low) / 2의 차이를 먼저 알아야 한다.

 

 

한 줄로 요약하자면 (high + low) / 2를 사용하면 overflow가 발생할 수 있으므로 low + (high - low) / 2와 같이 사용하여 항상 해당 값이 해당 자료형이 가질 수 있는 최대값보다 낮게 유지하는 것이다.

 

>>>와 >>는 본질적으로 같은 연산이지만 overflow가 발생했을때 어떻게 값이 처리되는지에 따라 달라진다.

 

>>는 연산 결과에 따라 가장 좌측에 1이나 0을 붙이지만 

>>>는 연산 결과에 상관없이 무조건 0을 붙인다.

 

int의 경우 overflow가 발생하면 음수를 표시하는 첫번째 비트가 1로 변경되지만 

>>>를 사용하면 연산 결과에 상관없이 0을 붙이므로 overflow를 방지할 수 있다.

 

 

결론 : >>와 >>>는 / 2를 손쉽게 표현하는데 활용할 수 있으며 >>>는 overflow를 방지할 수 있다.

'CS > Java' 카테고리의 다른 글

JSON을 파싱하는 방법  (0) 2022.10.21
자바에서 동시성 문제를 해결하는 방법  (0) 2022.09.17
자바의 변수 종류 정리  (0) 2022.08.31
자바 8, 11, 17 버전별 기능 차이  (0) 2022.08.26
자바 정규표현식  (0) 2022.08.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함