시프트 연산과 비트마스크

정채은·2025년 7월 15일

C++ 프로그래밍

목록 보기
12/16

비트(Bit)와 이진수(Binary)

컴퓨터는 모든 데이터를 0과 1로 표현한다. 이게 바로 이진수(binary number)이다..
그리고 비트(bit)는 0이나 1 하나를 나타내는 가장 작은 단위이다.

시프트 연산

시프트 연산은 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산이다.

좌측 시프트 (<<) : 숫자의 비트를 왼쪽으로 이동시키며, 오른쪽에 생기는 빈 공간은 항상 0으로 채워진다.
이건 2^n을 곱하는 것과 깉다.

예를 들어, 0010 << 1은 0100이 된다.

원래 숫자비트<< 1 결과비트
1000120010
2001040100

우측 시프트 (>>) : 숫자의 비트를 오른쪽으로 이동시킨다.
이때 왼쪽에 생기는 빈 공간을 무엇으로 채우느냐에 따라 논리 시프트산술 시프트로 나뉜다.

  • 논리 시프트 (Logical Shift) : 왼쪽에 무조건 0 채움

  • 산술 시프트 (Arithmetic Shift) : 왼쪽에 원래의 부호(=맨 앞 비트)로 채움

논리 시프트 vs. 산술 시프트

오른쪽 시프트 연산 시 왼쪽에 생기는 빈 공간을 무엇으로 채우느냐는 데이터의 "부호"에 따라 달라진다.

논리 시프트 (Logical Shift)

  • 정의: 오른쪽 시프트 시 왼쪽에 생기는 빈 공간을 항상 0으로 채우는 방식이다.

  • 주로 사용되는 경우: 부호 없는(unsigned) 정수를 시프트할 때 사용됩니다. 부호 없는 정수는 모든 비트가 데이터의 크기를 나타내므로, 최상위 비트(MSB)가 부호를 나타내지 않습니다. 따라서 어떤 비트가 채워지든 단순히 비트를 이동시키는 역할만 하면 됩니다.

예시: 0101 >> 1 (논리 시프트) → 0010

산술 시프트 (Arithmetic Shift)

  • 정의: 오른쪽 시프트 시 왼쪽에 생기는 빈 공간을 원래 숫자의 최상위 비트(MSB) 값으로 채우는 방식입니다. 즉, 숫자의 부호를 유지하면서 시프트하는 방식이다.

  • 주로 사용되는 경우: 부호 있는(signed) 정수를 시프트할 때 사용됩니다. 부호 있는 정수는 최상위 비트(MSB)가 부호 비트(0이면 양수, 1이면 음수)로 사용된다.

음수의 경우 1이 채워지는 이유:

  • 부호 비트 유지 : 산술 시프트의 목적은 숫자의 부호를 유지하면서 나누기와 유사한 효과를 내는 것이다. 만약 음수를 오른쪽으로 시프트할 때 0으로 채워버리면, 최상위 비트가 0이 되어 갑자기 양수로 바뀌는 문제가 발생한다.

  • 2의 보수 표현 : 컴퓨터에서 음수는 주로 2의 보수(Two's Complement) 방식으로 표현된다. 2의 보수 체계에서 음수를 오른쪽으로 시프트할 때 부호 비트(1)를 계속 채워 넣어야 원래 음수의 값을 유지하면서 2^n 으로 나누는 것과 같은 결과를 얻을 수 있다.

예시

  • 양수 : 0101 >> 1 (산술 시프트) → 0010 (최상위 비트가 0이므로 0으로 채움)

  • 음수 (2의 보수): -5를 4비트로 표현하면 1011 (MSB가 1)

    • 1011 >> 1 (산술 시프트) → 1101 (최상위 비트가 1이므로 1로 채움). 1101은 2의 보수 체계에서 -3을 의미한다. 만약 0으로 채웠다면 0101이 되어 +5로 바뀌는 문제가 발생한다.

보수법 (Complement)

보수법은 컴퓨터에서 음수를 표현하고 뺄셈을 덧셈으로 처리하기 위해 사용되는 방법이다. 특히 2의 보수는 부호 있는 정수를 표현하는 데 가장 널리 사용된다.

  • 1의 보수 (One's Complement): 모든 비트를 반전시킨 값이다.

  • 2의 보수 (Two's Complement): 1의 보수에 1을 더한 값이다.
    이 방식은 덧셈 연산을 통해 뺄셈을 처리할 수 있게 해주며, 양수와 음수를 일관된 방식으로 다룰 수 있게 한다.

산술 시프트 시 음수의 경우 1로 채워지는 것은 2의 보수 표현 체계에서 숫자의 부호와 값을 올바르게 유지하기 위한 필수적인 연산이다. 2의 보수 표현은 최상위 비트가 1일 때 음수를 나타내며, 이 비트가 유지되어야 숫자의 음수성이 보존된다.

결론

오른쪽 시프트 연산 시 왼쪽에 생기는 빈 공간을 0 또는 1로 채우는 것은 숫자의 부호 유무에 따라 달라지며, 이는 각각 논리 시프트와 산술 시프트로 구분된다.

특히 부호 있는 음수의 경우, 컴퓨터가 음수를 2의 보수로 표현하기 때문에, 산술 시프트 시 부호 비트(1) 를 유지하기 위해 왼쪽에 1이 채워지게 된다.

이는 시프트 연산이 원래 숫자의 부호를 보존하면서 올바른 결과(나눗셈과 유사한 효과)를 내도록 하기 위함이다.

profile
누군가에게 추억을 만들어주는 그날까지

0개의 댓글