산술 시프트(Arithmetic Shift)는 컴퓨터 공학 및 디지털 논리 회로에서 사용되는 비트 연산의 한 종류로, 이진수의 비트 열을 왼쪽 또는 오른쪽으로 이동시키면서 부호 비트(최상위 비트, MSB)를 보존하여 정수의 부호 있는 곱셈이나 나눗셈을 효율적으로 수행하는 연산이다.
종류 및 동작 원리
-
산술 좌측 시프트 (Arithmetic Left Shift)
- 모든 비트를 왼쪽으로 한 칸 이동시키고, 최하위 비트(LSB)를 0으로 채운다.
- 최상위 비트(MSB, 부호 비트)가 변경되지 않는 한, 이 연산은 2의 보수 표현에서 해당 정수를 2배(2^n배)하는 효과를 가진다.
- 연산 결과 최상위 비트가 변경되어 부호가 뒤집히는 경우 오버플로(Overflow)가 발생한다.
-
산술 우측 시프트 (Arithmetic Right Shift)
- 모든 비트를 오른쪽으로 한 칸 이동시키고, 최상위 비트(MSB, 부호 비트)에는 기존의 부호 비트 값을 그대로 복사하여 채운다(부호 확장, Sign Extension).
- 최하위 비트(LSB)는 버려진다.
- 이 연산은 2의 보수 표현에서 해당 정수를 2로 나눈 몫(내림 연산, 2^n으로 나눈 몫)을 구하는 효과를 가진다. 단, 음수인 경우 하드웨어 구현에 따라 반올림 방향이 다를 수 있으나, 일반적으로 0이 아닌 음의 무한대 방향(내림)으로 잘린다.
논리 시프트와의 차이점
- 논리 시프트(Logical Shift): 우측 시프트 시 최상위 비트를 항상 0으로 채운다. 부호 없는 정수(Unsigned Integer) 연산에 주로 사용된다.
- 산술 시프트(Arithmetic Shift): 우측 시프트 시 최상위 비트(부호 비트)를 유지한다. 부호 있는 정수(Signed Integer) 연산에 사용된다. 좌측 시프트의 경우 두 연산의 동작이 동일하다(최하위 비트를 0으로 채움).
활용
- 프로세서의 산술 논리 연산 장치(ALU)에서 곱셈기와 나눗셈기를 대체하거나 보조하는 고속 연산으로 널리 사용된다.
- C, C++, Java 등 주요 프로그래밍 언어에서 부호 있는 정수 타입(
int,long등)에 대한 우측 시프트 연산자(>>)는 일반적으로 산술 우측 시프트로 정의되거나 구현된다(단, C/C++ 표준에서는 구현 정의 사항으로 남겨두기도 함).
하드웨어 구현
- 배럴 시프터(Barrel Shifter) 등의 조합 논리 회로를 통해 단일 클럭 사이클 내에 n비트 시프트를 수행하도록 구현되는 것이 일반적이다.