(Java) 쉬프트 연산자

○ 논리합(or) |
각 비트를 비교하여 어느 한쪽이 1 이면 1, 그렇지 않으면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a|b = 1 1 1 1 1 1 1 1
10진수로 바꾸면 255 가 된다.





<시프트 연산자>
비트 열을 좌우로 지시한 만큼 이동시키는(shift) 연산자를 말한다.
C 에도 시프트 연산자가 있는데, C 에는 >> 과 << 만 있으나,
자바에는 추가적으로 >>> 연산자도 있다.
○ 왼쪽 시프트 연산자 <<
178 << 2 : 178 의 이진코드를 왼쪽으로 2비트 시프트 한다.
  10110010
1011001000
왼쪽으로 두칸 밀면서, 비게 되는 오른쪽 두칸은 0 으로 채운다.
그런데, 문제는 왼쪽으로 밀면서 기존의 크기를 넘어서기 때문에 왼쪽으로 넘어선 2개의 비트는 삭제된다.
따라서, 10110010 을 왼쪽으로 밀면 왼쪽 두개 비트인 10 은 삭제되고, 오른쪽의 2개 비트는 0으로 채워져
결과값은 11001000 이 된다.

○ 오른쪽 시프트 연산자 >>
178 >> 2 : 178의 이진코드를 오른쪽으로 2 비트 시프트 한다.
10110010
1110110010
오른쪽으로 2비트 이동한후, 비게되는 왼쪽의 2개비트는 1로 채워지고, 오른쪽에서 2비트 넘어간 부분은 삭제된다.
따라서, 10110010 을 오른쪽으로 2비트 시프트하면, 11101100 이 된다.
그런데, 주의할점은, 오른쪽으로 밀면서 왼쪽에 비게되는 비트부분이 무조건 1 로 채워지는 것이 아니라,
밀기전의 최초 첫째자리 값과 동일한 값으로 채워진다는 것이다.
여기에서는 밀기전의 첫째자리값이 1 이었으므로, 1 로 채워진 것이다.
○ 논리 오른쪽 시프트 연산자 >>>
178 >>> 2 : 오른쪽으로 2 비트 시프트한다.
자바에 추가된 논리 시프트는 오른쪽으로 밀면서 비게되는 앞쪽 비트를 무조건 0 으로 채워넣는 것이다.
10110010
0010110010
으로 되는 것으로,
역시 오른쪽으로 밀려난 2개 비트 10 은 삭제되고, 비게되는 왼쪽 2비트는 무조건 0으로 채워진다.
따라서 10110010 을 오른쪽으로 논리 시프트 하면, 00101100 이 된다.

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기