문제 설명
[L, R] 범위가 주어지면 이 범위에서 XOR이 두 정수의 모든 가능한 선택 중에서 최대가 되도록 두 정수를 찾아야 합니다.
주어진 범위가 L =1이고 R =21이면 -31이 15와 16의 XOR이고 범위 내에서 최대이므로 출력은 31이 됩니다.
알고리즘
1. Calculate the (L^R) value 2. From most significant bit of this value add all 1s to get the final result
예
#include <bits/stdc++.h> using namespace std; int getMaxXOR(int L, int R){ int LXR = L ^ R; int msbPos = 0; while (LXR) { msbPos++; LXR >>= 1; } int maxXOR = 0; int two = 1; while (msbPos--) { maxXOR += two; two <<= 1; } return maxXOR; } int main(){ int L = 1; int R = 21; cout << "Result = " << getMaxXOR(L, R) << endl; return 0; }
출력
위 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
Result = 31