#include <bits/stdc++.h>
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
void print_time() {}
template <typename T>
void update_max(T& x, T y) {
  x = max(x, y);
}
template <typename T>
void update_min(T& x, T y) {
  x = min(x, y);
}
template <typename T>
T min(T x, T y, T z) {
  return min(x, min(y, z));
}
template <typename T>
T max(T x, T y, T z) {
  return max(x, max(y, z));
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> pair) {
  return out << "(" << pair.first << ", " << pair.second << ")";
}
template <class T>
ostream& operator<<(ostream& out, vector<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class T>
ostream& operator<<(ostream& out, set<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class L, class R>
ostream& operator<<(ostream& out, map<L, R> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
const long long INF = 1LL << 35;
long long get_bit(long long x, long long i) { return (x >> i) & 1; }
long long solve(vector<long long>& x, long long k) {
  if (k < 0) {
    return 0;
  }
  if (x.size() == 0) {
    return INF;
  }
  if (x.size() == 1) {
    return 0;
  }
  vector<vector<long long>> y(2);
  for (long long xx : x) {
    y[get_bit(xx, k)].push_back(xx);
  }
  long long ans = INF;
  update_min(ans, solve(y[0], k - 1));
  update_min(ans, solve(y[1], k - 1));
  if (y[0].size() && y[1].size()) {
    ans += 1LL << k;
  }
  return ans;
}
void solve() {
  long long n;
  cin >> n;
  vector<long long> a(n);
  for (long long i = 0; i < n; ++i) {
    cin >> a[i];
  }
  long long ans = solve(a, 29);
  cout << ans;
}
int main() {
  cout << fixed << setprecision(20);
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long q;
  q = 1;
  while (q--) {
    solve();
  }
  print_time();
  return 0;
}
