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; }