이 튜토리얼에서는 한 숫자의 세트 비트(set bits)를 주어진 범위 내에서 다른 숫자로 복사하는 프로그램을 구현해 보겠습니다.
두 개의 정수가 주어졌을 때, 첫 번째 숫자의 비트를 하나씩 살펴보고 해당 비트가 지정된 범위 안에 있다면 두 번째 숫자의 같은 위치 비트도 1로 설정해야 합니다. 최종적으로 수정된 숫자를 출력하는 것이 목표입니다.
문제 해결 접근 방법
비트 마스크(bit mask)를 활용하면 이 문제를 간단히 해결할 수 있습니다. 지정된 범위의 각 비트 위치마다 마스크를 생성하고, 원본 숫자(y)의 해당 비트가 1로 설정되어 있는지 확인합니다. 만약 1이라면, 비트 OR 연산자(|)를 사용해 대상 숫자(x)의 같은 위치 비트를 1로 만들어 줍니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
// y의 세트 비트를 x로 복사
void copySetBits(unsigned &x, unsigned y,
unsigned l, unsigned r){
// l과 r은 1부터 32 사이의 값이어야 함
if (l < 1 || r > 32)
return ;
for (int i=l; i<=r; i++){
int mask = 1 << (i-1);
if (y & mask)
x = x | mask;
}
}
int main() {
unsigned x = 10, y = 13, l = 2, r = 3;
copySetBits(x, y, l, r);
cout << "Modified x: " << x;
return 0;
}
실행 결과
Modified x: 14
동작 원리 분석
x = 10(이진수 1010), y = 13(이진수 1101), 복사 범위 l = 2, r = 3으로 주어진 경우를 단계별로 살펴보겠습니다.
- i = 2: 마스크 값은 2(이진수 0010)입니다. y의 2번째 비트는 0이므로 x는 그대로 유지됩니다.
- i = 3: 마스크 값은 4(이진수 0100)입니다. y의 3번째 비트는 1이므로 x의 3번째 비트가 1로 설정됩니다.
그 결과 x는 1010에서 1110, 즉 십진수 14로 변경됩니다.
마무리
이처럼 비트 마스크와 OR 연산만으로도 특정 범위의 비트를 손쉽게 복사할 수 있습니다. 시간 복잡도는 O(r − l + 1)로 범위 크기에 비례하며, 유효성 검사를 통해 잘못된 범위 입력도 안전하게 처리합니다. 비트 조작 개념을 익히기에 좋은 기본 예제이니 직접 코드를 실행하며 동작을 확인해 보시기 바랍니다.