Description
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。
比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
思路
题解:两个数做或运算,根据1 | 1 = 1,但 1 + 1 = 0(二进制加法),因此根据这个结论我们可以从 x + y = x | y 推得 x & y = 0,转换为求得第 k 小的 y 使得 x & y = 0,将 k 转换成为二进制,那么其二进制位为 1 的需与 x 的二进制位为 0 的位对齐。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long x,k;
cin >> x >> k;
long long res = 0;
long long tmp = 1;
while (x){
if ((!(x & 1))){
if (k & 1){
res |= tmp;
}
k >>= 1;
}
x >>= 1;
tmp <<= 1;
}
while (k){
if (k & 1){
res |= tmp;
}
k >>= 1;
tmp <<= 1;
}
cout << res << endl;
return 0;
}