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 |