문제 링크
정수 가 주어지면 이고 인 수 중 제일 작은 값 를 구하시오.
LSB부터 MSB까지 순회하면서 1인 비트를 찾아 도 같은 위치의 비트를 켜준다.
이면 다시 LSB부터 MSB까지 순회하면서 0인 비트를 찾아 에서 같은 위치의 비트를 켜준다. 라면 패스
구한 가 정답.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int tc;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
// init
cin >> tc;
for (int tcCnt = 1; tcCnt <= tc; ++tcCnt) {
int x;
cin >> x;
int ans = 0;
for (int i = 0; i < 32; ++i) {
if (x & (1 << i)) {
ans += (1 << i);
break;
}
}
if (ans == x) {
for (int i = 0; i < 32; ++i) {
if ((x & (1 << i)) ^ (1 << i)) {
ans += (1 << i);
break;
}
}
}
cout << ans << '\n';
}
}
비트 연산자를 오랫만에 써서 구글링을 하면서 푼 문제
대회에서 나올 수도 있으니 숙지해야겠다.