이번 문제에서는 주어진 숫자에서 지정한 인덱스(위치)의 비트를 업데이트해야 합니다. 숫자의 특정 비트를 효율적으로 수정하려면 비트 조작(Bit Manipulation) 연산을 활용하면 됩니다. 예를 들어 다음과 같습니다.
입력 예시 −
N= 25 bit= 1 position= 2
출력 −
29
설명 − 입력값 25를 이진수로 표현하면 '11001'이며, 변경할 위치(인덱스)는 '2', 설정할 비트 값은 '1'입니다. 해당 위치의 값을 새 비트로 교체하면 이진수 '11101'이 되고, 이는 십진수 '29'와 동일합니다.
문제 해결 접근 방법
핵심 과제는 주어진 위치의 비트를 입력값으로 받은 특정 비트로 변경하는 것입니다. 가장 효율적인 방법은 먼저 해당 위치의 기존 비트를 클리어(clear)한 뒤, 새로운 비트 값을 설정하는 것입니다. 구체적인 단계는 다음과 같습니다.
숫자 N, 변경할 비트 값(bit), 비트를 변경할 위치(position)를 입력받습니다.
updateBit(int &n, int bit, int position)함수는 현재 숫자의 참조 주소, 새 비트 값, 그리고 변경 대상 인덱스를 매개변수로 받습니다. 이 함수는 해당 위치의 비트를 새 값으로 교체한 후 갱신된 숫자를 출력합니다.먼저 대상 위치의 기존 비트를 클리어하고, 그 결과를 중간 값으로 저장합니다.
마스크(mask)를 생성하고 클리어된 값과 AND 연산을 수행합니다.
마지막으로 생성한 마스크와, 새 비트 값을 해당 인덱스만큼 왼쪽 시프트한 값으로 OR 연산을 수행하여 최종 비트를 설정합니다.
구현 코드 예시
#include<iostream>
using namespace std;
void updateBit(int &n,int bit, int pos){
int clearBit= ~(1<<pos);
int mask= n & clearBit;
n= mask |(bit<<pos);
}
int main(){
int n=25;
int bit=1;
int pos=2;
updateBit(n,bit,pos);
cout<<n;
}출력 결과
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
29
입력값 25는 이진수로 11001입니다. 2번째 위치의 비트를 '1'로 교체하면 이진수 11101이 되며, 이는 십진수 29에 해당합니다. 이처럼 비트 클리어와 마스킹, OR 연산만으로도 추가 변수나 복잡한 로직 없이 원하는 위치의 비트를 간단히 수정할 수 있습니다.