비트 회전(Bit Rotation)이란?
주어진 숫자의 비트를 회전하는 C 프로그램을 작성하려면 먼저 다음과 같은 요소들을 이해해야 합니다.
- 비트는 왼쪽에서 오른쪽으로, 또는 오른쪽에서 왼쪽으로 회전할 수 있습니다.
- 왼쪽 회전(left rotation)에서는 각 비트가 왼쪽으로 이동하며, 가장 왼쪽에 있던 비트(MSB)는 다시 맨 오른쪽으로 순환합니다.
- 오른쪽 회전(right rotation)에서는 각 비트가 오른쪽으로 이동하며, 가장 오른쪽에 있던 비트(LSB)는 다시 맨 왼쪽으로 순환합니다.
- 사용자로부터 숫자와 함께 회전 횟수를 입력받아 지정된 방향으로 회전을 수행합니다.
일반적인 시프트(shift) 연산은 밀려나간 비트가 사라지지만, 회전(rotation)은 빠져나간 비트를 반대편에 다시 채워 넣는다는 점이 다릅니다. 또한 회전 횟수가 정수의 전체 비트 수(32비트)보다 클 경우를 대비해 모듈로(%) 연산으로 횟수를 조정하는 것이 좋습니다.
프로그램 1: 왼쪽 회전
다음은 주어진 숫자에 왼쪽 회전을 적용하는 C 프로그램입니다.
#include<stdio.h>
#include<stdlib.h>
int main(){
int number, rotate, Msb, size;
printf("Enter any number:");
scanf("%d",&number);
printf("Enter number of rotations:\n");
scanf("%d",&rotate);
size = sizeof(int) * 8;
rotate %= size;
while(rotate--){
Msb = (number >> size) & 1;
number = (number << 1) | Msb;
}
printf("After Left rotation the value is = %d\n",number);
return 0;
}동작 원리
프로그램은 매 반복마다 최상위 비트(MSB)를 추출한 뒤, 숫자를 왼쪽으로 1비트 시프트하고, 추출했던 MSB를 최하위 비트 자리에 OR(|) 연산으로 채워 넣습니다. 이 과정을 입력받은 회전 횟수만큼 반복합니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter any number:12 Enter number of rotations: 2 After Left rotation the value is = 48
숫자 12는 이진수로 ...00001100입니다. 여기서 왼쪽으로 2비트 회전하면 ...00110000, 즉 십진수 48이 됩니다.
프로그램 2: 오른쪽 회전
다음은 주어진 숫자에 오른쪽 회전을 적용하는 C 프로그램입니다.
#include<stdio.h>
#include<stdlib.h>
int main(){
int number, rotate, Lsb, size;
printf("Enter any number:");
scanf("%d",&number);
printf("Enter number of rotations:\n");
scanf("%d",&rotate);
size = sizeof(int) * 8;
rotate %= size;
while(rotate--){
Lsb = number & 1;
number = (number >> 1) &(~(1<<size));
number = number|(Lsb<<size);
}
printf("After right rotation the value is = %d\n",number);
return 0;
}동작 원리
프로그램은 매 반복마다 최하위 비트(LSB)를 추출하고, 숫자를 오른쪽으로 1비트 시프트한 뒤, 추출했던 LSB를 최상위 비트 자리에 배치합니다. 이 과정을 반복하면서 부호 비트 영향을 제거하기 위해 마스크 연산도 함께 수행합니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter any number:18 Enter number of rotations: 2 After right rotation the value is = 4
숫자 18은 이진수로 ...00010010입니다. 오른쪽으로 2비트 회전하면 ...00000100, 즉 십진수 4가 됩니다.
참고 사항
부호 있는 정수(int)에 시프트 연산을 적용하면 음수 처리 시 컴파일러에 따라 결과가 달라질 수 있습니다. 실무에서는 unsigned int를 사용하거나 비트 위치를 명확히 지정하여(예: 32비트 기준 31번째 비트) 구현하는 것이 더 안전합니다.