description: You are given two integers n and m. Find the \operatorname{MEX} of the sequence n ⊕ 0, n ⊕ 1, …, n ⊕ m. Here, ⊕ is the [bitwise XOR operator](https://en.wikipedia.org/wiki/Bitwise_operation#XOR).
  
  \operatorname{MEX} of the sequence of non-negative integers is the smallest non-negative integer that doesn't appear in this sequence. For example, \operatorname{MEX}(0, 1, 2, 4) = 3, and \operatorname{MEX}(1, 2021) = 0. 
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 30 000) — the number of test cases.
  
  The first and only line of each test case contains two integers n and m (0 ≤ n, m ≤ 10^9).
  
  Output
  
  For each test case, print a single integer — the answer to the problem.
  
  Example
  
  Input
  
  
  5
  3 5
  4 6
  3 2
  69 696
  123456 654321
  
  
  Output
  
  
  4
  3
  0
  640
  530866
  
  Note
  
  In the first test case, the sequence is 3 ⊕ 0, 3 ⊕ 1, 3 ⊕ 2, 3 ⊕ 3, 3 ⊕ 4, 3 ⊕ 5, or 3, 2, 1, 0, 7, 6. The smallest non-negative integer which isn't present in the sequence i. e. the \operatorname{MEX} of the sequence is 4.
  
  In the second test case, the sequence is 4 ⊕ 0, 4 ⊕ 1, 4 ⊕ 2, 4 ⊕ 3, 4 ⊕ 4, 4 ⊕ 5, 4 ⊕ 6, or 4, 5, 6, 7, 0, 1, 2. The smallest non-negative integer which isn't present in the sequence i. e. the \operatorname{MEX} of the sequence is 3.
  
  In the third test case, the sequence is 3 ⊕ 0, 3 ⊕ 1, 3 ⊕ 2, or 3, 2, 1. The smallest non-negative integer which isn't present in the sequence i. e. the \operatorname{MEX} of the sequence is 0.
solution: #include <bits/stdc++.h>
  using namespace std;
  long long expo(long long a, long long b) {
    if (b == 0) {
      return 1;
    }
    long long z = expo(a, b / 2);
    z *= z;
    z %= 1000000007;
    if (b % 2 != 0) {
      z *= a;
      z %= 1000000007;
    }
    return z;
  }
  long long gcd(long long a, long long b) {
    if (a == 0) return b;
    return gcd(b % a, a);
  }
  void solve() {
    long long n, m;
    cin >> n;
    cin >> m;
    if (m < n) {
      cout << "0\n";
      return;
    }
    vector<int> v1(32, 0);
    vector<int> v2(32, 0);
    int i = 0;
    while (n > 0) {
      v1[i] = n % 2;
      n /= 2;
      i++;
    }
    int j = 0;
    bool f = true;
    while (m > 0) {
      v2[j] = m % 2;
      if (v2[j] == 0) {
        f = false;
      }
      m /= 2;
      j++;
    }
    long long ans = 0;
    if (f) {
      ans = (1ll << j);
      cout << ans << "\n";
      return;
    }
    f = true;
    for (int j1 = 31; j1 >= 0; j1--) {
      if (v1[j1] == 1 && v2[j1] == 0) {
        f = false;
        break;
      }
    }
    if (f) {
      long long ansf = 100000000000000000;
      ans = 0;
      bool first = false;
      for (int j1 = 31; j1 >= 0; j1--) {
        if (v1[j1] == 0 && v2[j1] == 1) {
          first = true;
          ans += (1ll << j1);
        } else if (v1[j1] == 0 && v2[j1] == 0) {
          long long ans2 = (1ll << j1);
          ans2 += ans;
          ansf = min(ansf, ans2);
        }
      }
      cout << ansf << "\n";
      return;
    }
    long long ansf = 100000000000000000;
    for (int j1 = 31; j1 >= 0; j1--) {
      if (v1[j1] == 0 && v2[j1] == 1) {
        ans += (1ll << j1);
      } else if (v1[j1] == 0 && v2[j1] == 0) {
        long long ans2 = (1ll << j1);
        ans2 += ans;
        ansf = min(ansf, ans2);
      } else if (v1[j1] == 1 && v2[j1] == 0) {
        break;
      }
    }
    ansf = min(ans, ansf);
    cout << ansf << "\n";
  }
  int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
      solve();
    }
    return 0;
  }
  