#include <bits/stdc++.h>
using std::max;
using std::min;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int L[N * 40], R[N * 40], ch[N * 40][2], tot;
int n, a[N], root;
void Insert(int &now, int x, int dep) {
  if (!now) now = ++tot;
  L[now] = min(L[now], x), R[now] = max(R[now], x);
  if (dep < 0) return;
  int bit = a[x] >> dep & 1;
  Insert(ch[now][bit], x, dep - 1);
}
int query(int now, int val, int dep) {
  if (dep < 0) return 0;
  int bit = val >> dep & 1;
  if (ch[now][bit])
    return query(ch[now][bit], val, dep - 1);
  else
    return query(ch[now][bit ^ 1], val, dep - 1) + (1 << dep);
}
long long dfs(int now, int dep) {
  if (dep < 0) return 0;
  if (R[ch[now][0]] && R[ch[now][1]]) {
    int mi = inf;
    if (R[ch[now][0]] - L[ch[now][0]] <= R[ch[now][1]] - L[ch[now][1]]) {
      for (int i = L[ch[now][0]]; i <= R[ch[now][0]]; i++)
        mi = min(mi, query(ch[now][1], a[i], dep - 1));
    } else {
      for (int i = L[ch[now][1]]; i <= R[ch[now][1]]; i++)
        mi = min(mi, query(ch[now][0], a[i], dep - 1));
    }
    return dfs(ch[now][0], dep - 1) + dfs(ch[now][1], dep - 1) + mi +
           (1 << dep);
  }
  if (R[ch[now][0]]) return dfs(ch[now][0], dep - 1);
  if (R[ch[now][1]]) return dfs(ch[now][1], dep - 1);
  return 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  std::sort(a + 1, a + 1 + n);
  memset(L, 0x3f, sizeof(L));
  for (int i = 1; i <= n; i++) Insert(root, i, 30);
  printf("%lld\n", dfs(root, 30));
  return 0;
}
