#include <bits/stdc++.h>
using namespace std;
int const MAXN = 2e5 + 10;
int n;
int a[MAXN], L[MAXN * 30], R[MAXN * 30];
struct Trie {
  int tot = 1;
  int trie[MAXN * 30][2];
  void insert(int pos) {
    int x = 1;
    for (int i = 30;; i--) {
      int dir = (a[pos] >> i) & 1;
      L[x] = min(L[x], pos), R[x] = max(R[x], pos);
      if (i < 0) break;
      if (!trie[x][dir]) trie[x][dir] = ++tot;
      x = trie[x][dir];
    }
    return;
  }
  long long query(int x, int now, int dep) {
    if (dep < 0) return 0ll;
    int dir = (x >> dep) & 1;
    if (trie[now][dir])
      return query(x, trie[now][dir], dep - 1);
    else
      return query(x, trie[now][dir ^ 1], dep - 1) + (1ll << dep);
  }
  long long dfs(int now, int dep) {
    if (dep < 0) return 0;
    if (trie[now][0] && trie[now][1]) {
      long long ans = 1ll << 30;
      for (int i = L[trie[now][0]]; i <= R[trie[now][0]]; i++) {
        ans = min(ans, (long long)query(a[i], trie[now][1], dep - 1));
      }
      ans += dfs(trie[now][0], dep - 1);
      ans += dfs(trie[now][1], dep - 1);
      ans += (1 << dep);
      return ans;
    } else if (trie[now][0]) {
      return dfs(trie[now][0], dep - 1);
    } else if (trie[now][1]) {
      return dfs(trie[now][1], dep - 1);
    }
    return 0ll;
  }
} trie;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  sort(a + 1, a + n + 1);
  memset(L, 0x3f, sizeof(L));
  for (int i = 1; i <= n; i++) trie.insert(i);
  printf("%lld\n", trie.dfs(1, 30));
  return 0;
}
