산술 시프트

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
23(10)(00010111(2))에 대한 좌측 산술시프트의 예제, 밀려서 새로 생기는 빈칸은 0으로 채워넣는다. 이 연산의 결과는 23에 2를 곱한 수인 46(10)(00101110(2))이 나온다.
23(10)(00010111(2))에 대한 우측 산술시프트의 예제, 부호가 정의된 2진법 정수(signed integer)에서 산술시프트를 시도하는 경우 최상위 비트(MSB)이자 부호비트(sign bit)인 0은 그대로 유지되며 한칸씩 좌측으로 이동한다. 이 연산의 결과는 23을 2로 나누고 소수점을 버린 결과인 11(10)(00001011(2))이 나온다.

산술 시프트연산자 중 하나로서 특수한 2의 거듭제곱수(2, 4, 8, 16 ... 등)와 관련한 곱셈나눗셈을 연산할때 사용된다.

개요[편집]

기호로는 보통 \ll, \gg 가 사용되며 a \ll n의 형태로 표시된다. 이 연산의 의미는 컴퓨터메모리에 저장된 2진법 숫자를 n비트만큼 좌 또는 우로 이동하라는 의미이며, 한칸마다 2를 곱하거나 나누는 것과 동일한(또는 비슷한) 결과가 나온다. 따라서 이 연산은 다음과 같은 의미를 지닌다

 a \ll n = a \times 2^n
a \gg n = a \times 2^{-n}
(소수점 이하 버림)

어떤 메모리 값을 2의 배수 형태의 상수와 곱하거나 나눌 때에는 곱셈/나눗셈 대신에 산술 시프트를 이용할 수 있다. 또한 많은 CPU에서는 상수 곱셈 등의 연산을 시프트 연산자로 처리하는 것이 산술 논리 장치를 거치는 것보다 빠르기 때문에, 컴파일러에서는 곱셈/나눗셈 연산을 자동적으로 산술 시프트 명령어로 변환한다.

논리 시프트와의 차이[편집]

이와 비슷한 연산으로 논리 시프트가 있다. 이 연산 역시 비트를 이동하는 연산이나, 산술 시프트와의 제일 큰 차이는 부호비트(sign bit)가 보존되지 않는다는 것이다. 따라서 부호가 정의된 16비트 정수(signed integer)에서 연산의 결과값이100 0000(2)=32768(10) 이상의 범위를 넘어갈 경우 부호가 바뀌는 경우가 발생한다.

예제[편집]

  • a<<3 + a<<1 과 10 * a는 같은 뜻이다.

같이보기[편집]

참고자료 및 주석[편집]