컴퓨터의 모든 정보는 0과 1 값만 가지는 2진수로 다루어진다.
2진수의 한 자리를 비트(bit)라 부르며 8개의 비트를 바이트(byte)라고 한다.
바이트는 10000000부터 01111111까지 표현할 수 있으므로 10진수로 계산하면 -128부터 127까지의 값을 가진다.
양수의 산술적 시프트 연산
// 5를 산술적 왼쪽 시프트 2번
byte a = 5;
byte b = (byte)(a<<2); // 20
// 20을 산술적 오른쪽 시프트 2번
byte c = 20;
byte d = (byte)(c>>2); // 5
첫 번째 코드인 산술적 왼쪽 시프트를 보자.
a를 바이트로 표현하면 00000101 이다.
산술적 왼쪽 시프트는 각 비트를 왼쪽으로 옮기고 최하위 비트에 0을 채워 넣는다.
왼쪽으로 한 번 시프트를 하면 00001010 이다.
이어서 한 번 더 왼쪽 시프트를 하면 00010100 이다.
이를 10진수로 계산하면 2^4 + 2^2 = 20 이므로 20이라는 값을 가진다.
두 번째 코드인 산술적 오른쪽 시프트를 보자.
c를 바이트로 표현하면 00010100 이다.
산술적 오른쪽 시프트는 각 비트를 오른쪽으로 옮기고 최상위 비트에 옮기기 전 최상위 비트 값을 채워 넣는다.
오른쪽으로 한 번 시프트를 하면 00001010 이다.
이어서 한 번 더 오른쪽 시프트를 하면 00000101 이다.
이를 10진수로 계산하면 2^2 + 2^0 = 5 이므로 5라는 값을 가진다.
음수의 산술적 시프트 연산
컴퓨터는 주로 음수를 다룰 때 2의 보수 방식을 적용한다.
2의 보수 방식에서 최상위 비트는 부호를 의미한다.
즉, 최상위 비트가 1이면 음수, 최상위 비트가 0이면 양수이다.
음수를 이진수로 표현하기 위해서는 아래의 단계(2의 보수)를 거쳐야 한다.
1. 양수의 2진수 표현을 구한다. | 00000101 |
2. 각 비트를 반전시킨다. (1의 보수) | 11111010 |
3. 값에 1을 더한다. | 11111011 |
시프트 연산은 양수의 산술적 시프트 연산과 동일한 방법으로 진행된다.
이때 음수의 왼쪽 시프트 연산은 최상위 비트의 값이 달라져 부호가 바뀔 가능성이 있기 때문에 주의해야 한다.
결과적으로 산술적 시프트 연산(>>,<<)은 나누기 2, 곱하기 2의 효과가 나타난다.
주의할 점이 있다면 시프트 연산에서는 소수점 이하를 버림한다는 점이다.
예를 들어 7/2는 3.5지만, 7>>1은 3이라는 값을 가진다.
또한 왼쪽 시프트를 과도하게 사용할 경우 값이 표현할 수 있는 범위를 넘어 오버플로우가 발생할 수 있어 주의해야 한다.
'언어, 프레임워크 > Java' 카테고리의 다른 글
접근 지정자 / final (0) | 2025.02.03 |
---|---|
this() / 가비지 컬렉션 (1) | 2025.02.03 |
예외 처리 (0) | 2025.01.31 |
배열 (0) | 2025.01.31 |
Java 알아보기 (0) | 2025.01.21 |