#include <bits/stdc++.h>
using namespace std;
inline int L(int i) { return i << 1; }
inline int R(int i) { return (i << 1) | 1; }
inline long long max(long long a, long long b) { return a < b ? b : a; }
inline long long min(long long a, long long b) { return a < b ? a : b; }
inline int abs(int x) { return x < 0 ? -x : x; }
struct data {
  long long l, r;
} A[2][10100], tmp;
int top[2];
long long B[33];
void init() {
  int i;
  B[0] = 1;
  for (i = 1; i < 33; i++) B[i] = B[i - 1] << 1;
}
void dfs(long long l, long long r, int id, int n) {
  l = max(1, l);
  r = min(B[n] - 1, r);
  if (l <= r) {
    tmp.l = l, tmp.r = r;
    A[id][top[id]++] = tmp;
    if (!((l <= 1) && (r >= B[n - 1] - 1))) {
      dfs(l, r, id, n - 1);
      dfs(l - B[n - 1], r - B[n - 1], id, n - 1);
    }
  }
}
int main() {
  long long l1, r1, l2, r2, ret;
  int i, j;
  init();
  while (cin >> l1 >> r1 >> l2 >> r2) {
    top[0] = top[1] = 0;
    dfs(l1, r1, 0, 30);
    dfs(l2, r2, 1, 30);
    ret = 0;
    for (i = 0; i < top[0]; i++)
      for (j = 0; j < top[1]; j++)
        ret =
            max(min(A[0][i].r, A[1][j].r) - max(A[0][i].l, A[1][j].l) + 1, ret);
    cout << ret << endl;
  }
  return 0;
}
