#include <cstdio>
using namespace std;
typedef long long ll;
ll calc(ll l, ll r) {
ll ans = 0;
for (ll i = 0; i <= 60; i++) {
if ((((l >> i) & 1) == 1) && ((l >> i) == (r >> i))) {
ans |= 1 << i;
}
}
return ans;
}
int main() {
int t;
scanf("%d", &t);
for (ll n, x, l, r, ans, mid; t != 0; t--) {
scanf("%lld %lld", &n, &x);
l = n;
r = 1;
while (r <= n) {
r <<= 1;
}
ans = -1;
while (l <= r) {
mid = (l + r) / 2;
if (calc(n, mid) <= x) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
if (ans != -1 && calc(n, ans) == x) {
printf("%lld\n", ans);
} else {
printf("-1\n");
}
}
return 0;
}
我写了个二分,然后它寄了,为什么呢?