프로그래밍 언어 및 기술 [언제나휴일]

비트 자리 이동 연산, 쉬프트 연산 본문

C & C++/언제나 C언어

비트 자리 이동 연산, 쉬프트 연산

언휴 2025. 1. 3. 12:55

안녕하세요. 언제나 휴일에 언휴예요.

비트 자리 이동 연산, 쉬프트 연산 [C언어]

 

이번 강의는 비트 자리 이동 연산, 쉬프트 연산을 알아볼게요.

1. 왼쪽 쉬프트 <<
2. 오른쪽 쉬프트 >>

1. 왼쪽 쉬프트 <<

왼쪽 쉬프트 연산은 1자리를 이동할 때 2로 곱한 결과와 같습니다.

 

다음의 소스 코드는 부호 없는 정수 3을 4자리 왼쪽으로 자리 이동 시키는 소스 코드입니다.
그리고 부호 있는 정수 -3을 4자리 왼쪽으로 자리 이동 시키는 소스 코드입니다.

#include 

int main()
{  
    unsigned u1 = 3, u2;
    u2 = u1 << 4;//shl
    printf("16진수: %X %X\n", u1, u2);
    printf("10진수: %d %d\n", u1, u2);

    int i1 = -3, i2;
    i2 = i1 << 4;//shl
    printf("16진수: %X %X\n", i1,i2);
    printf("10진수: %d %d\n", i1, i2);
    return 0;
}

실행 결과는 다음과 같습니다.

16진수: 3 30
10진수: 3 48
16진수: FFFFFFFD FFFFFFD0
10진수: -3 -48

결과를 보면 부호 없는 정수는 원래 값 3에 2의 4승인 16을 곱한 48임을 알 수 있습니다.

[그림] 부호 없는 정수를 왼쪽으로 자리 이동

결과를 보면 부호 있는 정수는 원래 값 3에 2의 4승인 16을 곱한 48임을 알 수 있습니다.

[그림] 부호 있는 정수를 왼쪽으로 자리 이동

이를 통해 왼쪽 쉬프트 연산으로 n비트 자리 이동하면 2의 n승을 곱한 결과를 갖는 것을 알 수 있습니다.

참고로 왼쪽 쉬프트 연산은 빈 자리를 0으로 채우는 논리 쉬프트 연산입니다.

2. 오른쪽 쉬프트 >>

오른쪽 쉬프트 연산은 1자리를 이동할 때 2로 나눈 결과와 같습니다.

 

다음의 소스 코드는 부호 없는 정수 48을 4자리 오른쪽으로 자리 이동 시키는 소스 코드입니다.
그리고 부호 있는 정수 -48을 4자리 오른쪽으로 자리 이동 시키는 소스 코드입니다.

#include 

int main()
{  
    unsigned u1 = 48, u2;
    u2 = u1 >> 4;//shr
    printf("16진수: %X %X\n", u1, u2);
    printf("10진수: %d %d\n", u1, u2);

    int i1 = -48, i2;
    i2 = i1 >> 4;//sar
    printf("16진수: %X %X\n", i1, i2);
    printf("10진수: %d %d\n", i1, i2);
    return 0;
}

실행 결과는 다음과 같습니다.

16진수: 30 3
10진수: 48 3
16진수: FFFFFFD0 FFFFFFFD
10진수: -48 -3

결과를 보면 부호 없는 정수는 원래 값 48에 2의 4승인 16을 나눈 3임을 알 수 있습니다.

[그림] 부호 없는 정수를 오른쪽으로 자리 이동

결과를 보면 부호 있는 정수는 원래 값 -48에 2의 4승인 16을 나눈 -3임을 알 수 있습니다.

[그림] 부호 있는 정수를 오른쪽으로 자리 이동

이를 통해 왼쪽 쉬프트 연산으로 n비트 자리 이동하면 2의 n승을 곱한 결과를 갖는 것을 알 수 있습니다.

참고로 부호 없는 정수의 오른쪽 쉬프트 연산은 논리 쉬프트 연산입니다. (왼쪽 쉬프트와 같습니다.)
부호 있는 정수의 오른쪽 쉬프트 연산은 산술 쉬프트 연산입니다.
산술 쉬프트 연산은 빈 자리를 부호 비트로 채우는 쉬프트 연산입니다.


언제나휴일 추천 여행 및 산책

에버랜드 크리스마스 퍼레이드에서 요정이 나타났다.