WIPIVERSE

산술 시프트

산술 시프트(Arithmetic Shift)는 컴퓨터 공학 및 디지털 논리 회로에서 사용되는 비트 연산의 한 종류로, 이진수의 비트 열을 왼쪽 또는 오른쪽으로 이동시키면서 부호 비트(최상위 비트, MSB)를 보존하여 정수의 부호 있는 곱셈이나 나눗셈을 효율적으로 수행하는 연산이다.

종류 및 동작 원리

  1. 산술 좌측 시프트 (Arithmetic Left Shift)

    • 모든 비트를 왼쪽으로 한 칸 이동시키고, 최하위 비트(LSB)를 0으로 채운다.
    • 최상위 비트(MSB, 부호 비트)가 변경되지 않는 한, 이 연산은 2의 보수 표현에서 해당 정수를 2배(2^n배)하는 효과를 가진다.
    • 연산 결과 최상위 비트가 변경되어 부호가 뒤집히는 경우 오버플로(Overflow)가 발생한다.
  2. 산술 우측 시프트 (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비트 시프트를 수행하도록 구현되는 것이 일반적이다.
둘러보기

더 찾아볼 만한 주제

    전체 문서 보기