#include <bits/stdc++.h>
using namespace std;
const int N = 200007;
long long maxn = 1e18 + 7;
int n, a[N], cnt, p, ans;
struct madoka {
  int l;
  int r;
} ma[30 * N];
vector<int> ho;
void up(int &p, int z, int h) {
  if (!p) {
    p = ++cnt;
  }
  if (h == -1) return;
  if (z >= (1 << h)) {
    up(ma[p].r, z - (1 << h), h - 1);
  } else {
    up(ma[p].l, z, h - 1);
  }
}
int qry(int z, int p, int h) {
  if (h == -1) return 0;
  int lin = z & (1 << h);
  if (lin) {
    if (ma[p].r) {
      return qry(z, ma[p].r, h - 1);
    } else {
      return (1 << h) + qry(z, ma[p].l, h - 1);
    }
  } else {
    if (ma[p].l) {
      return qry(z, ma[p].l, h - 1);
    } else {
      return (1 << h) + qry(z, ma[p].r, h - 1);
    }
  }
}
long long dfs(vector<int> ho, int p, int h) {
  if (p == 0) return 0;
  vector<int> lp, rp;
  long long ans = maxn;
  int lim = (1 << h);
  for (int i = 0; i < ho.size(); i++) {
    if (ho[i] & lim) {
      rp.push_back(ho[i]);
    } else {
      lp.push_back(ho[i]);
    }
  }
  if (lp.size() && rp.size()) {
    for (int i = 0; i < rp.size(); i++) {
      ans = min(ans, (1 << h) + (long long)qry(rp[i], ma[p].l, h - 1));
    }
  } else {
    ans = 0;
  }
  return ans + dfs(lp, ma[p].l, h - 1) + dfs(rp, ma[p].r, h - 1);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    ho.push_back(a[i]);
    up(p, a[i], 30);
  }
  printf("%lld\n", dfs(ho, 1, 30));
}
