야나도 프로젝트

나도 개발자 될수있어

JAVA

JAVA 시프트연산자

jmeen 2021. 8. 19. 21:34
728x90

정수의 비트를 왼쪽 혹은 오른쪽으로 옮긴 값을 생성하는 것.

1. << 왼쪽(좌) 시프트

a= 0010 a<<1 a=0100

a<<1 을 하면  a를 왼쪽으로 1칸 옮겨라. 

비어있는 비트는 0으로 채운다.

 

그럼 값은 어떻게 될까? 

2진수의 각 칸은 2의 거듭제곱의 가치를 지닌다.

한칸 왼쪽으로 가면 2배 늘어난다.

 

2. >> 오른쪽(우) 시프트 - 산술

오른쪽으로 가는것은 두가지로 나뉜다. 산술과 논리이다.

먼저 산술은 맨처음 부호확장자를 유지하며, 추가되는 칸은 부호의 칸을 넣는다.

a= 00011000 a >> 2  a = 00000110
b= 10011000 b >> 2 b = 11100110

부호를 유지하며 공란을 부호의 수로 채운다.

산술 시프트일 경우 오른쪽으로 한칸 갈때마다 1/2 가 된다.

 

3. >>> 오른쪽(우) 시프트 - 논리

산술시프트와 원리는 같지만, 부호를 특별취급하지 않는다.

첫번째 칸이 음수라 1로 시작하더라도, 공란은 0으로 시작하기때문에 음수가 양수가된다.

a= 00011000 a >>> 2 a = 00000110
b= 10011000 b >>> 2 b = 00100110

 


4. 비트 회전

시프트 연산의 응용버전이다. 처음과 끝이 붙어있다 생각하고 회전시킨다.

a = 1 1 1 0 0 0 0 0 1 1 0 1 

 

자 이것을 3칸 오른쪽으로 회전해보자

 

1. a>>>3

0 0 0 1 1 1 0 0 0 0 0 1 

부호 상관없이 3칸 오른쪽으로 밀렸다.

 

2. a<<12-3 (전체 비트 - 이동할 비트)

1 0 1 0 0 0 0 0 0 0 0 0

101의 끝 3자리를 맨앞으로 보내기 위해 9칸 왼쪽으로 밀었다.

 

3. a>>>3 | a<<12-3 (1번과 2번의 비트단위 논리합)

1번과 2번의 논리합을 한다.

 

논리합은 둘중에 하나라도 1이면 1을 표시한다.

그러면

1 0 1 1 1 1 0 0 0 0 0 1

끝의 3자리가 앞으로 이동한 것을 볼 수 있다.

'JAVA' 카테고리의 다른 글

비트단위 논리연산  (0) 2021.08.21
난수 중복 방지 알고리즘 - 2  (0) 2021.08.16
중복값 판단 알고리즘  (0) 2021.08.16
알쏭달쏭자바200제 : 읽은 갯수만큼 별찍기  (0) 2021.08.14
Servlet & JSP  (0) 2021.08.11