#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#ifndef ONLINE_JUDGE
#define debug(x) cerr<<#x<<" "; _print(x); cerr<<nline;
#else
#define debug(x);
#endif
#define ll long long
/*
------------------------Input Checker----------------------------------
*/
long long readInt(long long l,long long r,char endd){
long long x=0;
int cnt=0;
int fi=-1;
bool is_neg=false;
while(true){
char g=getchar();
if(g=='-'){
assert(fi==-1);
is_neg=true;
continue;
}
if('0'<=g && g<='9'){
x*=10;
x+=g-'0';
if(cnt==0){
fi=g-'0';
}
cnt++;
assert(fi!=0 || cnt==1);
assert(fi!=0 || is_neg==false);
assert(!(cnt>19 || ( cnt==19 && fi>1) ));
} else if(g==endd){
if(is_neg){
x= -x;
}
if(!(l <= x && x <= r))
{
cerr << l << ' ' << r << ' ' << x << '\n';
assert(1 == 0);
}
return x;
} else {
assert(false);
}
}
}
string readString(int l,int r,char endd){
string ret="";
int cnt=0;
while(true){
char g=getchar();
assert(g!=-1);
if(g==endd){
break;
}
cnt++;
ret+=g;
}
assert(l<=cnt && cnt<=r);
return ret;
}
long long readIntSp(long long l,long long r){
return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
return readString(l,r,'\n');
}
string readStringSp(int l,int r){
return readString(l,r,' ');
}
/*
------------------------Main code starts here----------------------------------
*/
const int B = 60;
int sufl[B], sufg[B];
int prel[B], pree[B];
inline int bit(long long x, int p){
return (x >> p) & 1;
}
inline void compute1(long long L, long long P){
if(bit(L, 0)){
sufl[0] = sufg[0] = bit(P, 0)^1;
}else{
sufl[0] = 1;
sufg[0] = 0;
}
int nbits = bit(L, 0);
for(int i = 1; i < B; i++){
if(bit(P, i) == 0){
sufl[i] = sufl[i - 1];
}else if(bit(L, i) == 0){
sufl[i] = 0;
if(nbits == 0){
sufl[i] ^= 1;
}
}else{
sufl[i] = sufl[i - 1];
if(nbits == 0){
sufl[i] ^= 1;
}
}
nbits += bit(L, i);
if(nbits == 0){
sufg[i] = sufl[i]^1;
}else{
sufg[i] = sufl[i];
}
}
}
inline void compute2(long long L, long long P){
int cur = 1;
for(int i = B - 1; i >= 0; i--){
if(cur && bit(P, i) && !bit(L, i)){
cur = 0;
}
pree[i] = cur;
}
if(bit(L, B - 1)){
prel[B - 1] = bit(P, B - 1)^1;
}else{
prel[B - 1] = 1;
}
for(int i = B - 2; i >= 0; i--){
if(bit(L, i)){
if(bit(P, i)){
prel[i] = 0;
}else{
prel[i] = pree[i + 1];
}
}else{
prel[i] = prel[i + 1];
}
}
}
inline long long computeAnswer(long long L, long long P){
compute1(L, P);
compute2(L, P);
long long ans = 0;
for(int i = 0; i < B; i++){
int nodd;
int neve;
if(i == B - 1){
if(bit(P, i)){
nodd = 1;
}else{
nodd = 0;
}
neve = 0;
}else{
if(bit(P, i)){
if(bit(L, i)){
neve = prel[i + 1]^pree[i + 1];
}else{
neve = 0;
}
nodd = prel[i + 1];
}else{
if(bit(L, i)){
nodd = prel[i + 1]^pree[i + 1];
}else{
nodd = 0;
}
neve = prel[i + 1]^pree[i + 1];
}
}
if(i == 0){
if(nodd){
ans ^= (1LL << i);
}
}else{
int cnt = (nodd & sufl[i - 1])^(neve & sufg[i - 1]);
if(cnt){
ans ^= (1LL << i);
}
}
}
return ans;
}
inline long long brute(long long K, long long P){
long long ret = 0;
for(long long J = 1; J <= P; J++){
if(((K + P - J)&K) == K){
ret ^= J;
}
}
return ret;
}
void stressTest(int BB){
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
for(int i = 0; i < 100000; i++){
cout << "Testing " << i << "-th round with ";
int K = rng()&((1 << BB) - 1);
int P = rng()&((1 << BB) - 1);
cout << "K = " << K << " and P = " << P << endl;
assert(brute(K, P) == computeAnswer(((1 << BB) - 1)^K, P));
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
freopen("error.txt", "w", stderr);
#endif
// stressTest(20);
ll Q = readIntLn(1,1e5);
while(Q--){
ll K = readIntSp(0,1e18);
ll P = readIntLn(1,1e18);
if(K == 0){
cout << P << '\n';
continue;
}
K--;
long long L = ((1LL << B) - 1)^K;
cout << computeAnswer(L, P) << '\n';
}
assert(getchar()==-1);
return 0;
}