#include <bits/stdc++.h>
using namespace std;
int pows[31];
int get_max(int l1, int r1, int l2, int r2, int k) {
  if (l1 == 0 || l2 == 0 || r1 == 0 || r2 == 0 || l1 > r1 || l2 > r2) return 0;
  if (k == 1) return 1;
  if (l2 > pows[k - 1]) {
    l2 -= pows[k - 1];
    r2 -= pows[k - 1];
  }
  if (l1 > pows[k - 1]) {
    l1 -= pows[k - 1];
    r1 -= pows[k - 1];
  }
  if (r1 < pows[k - 1] && r2 < pows[k - 1])
    return get_max(l1, r1, l2, r2, k - 1);
  if (r1 >= pows[k - 1]) {
    if (r2 >= pows[k - 1]) {
      int res = min(r1, r2) - max(l1, l2) + 1;
      if (res < min(r1 - pows[k - 1], r2 - pows[k - 1]))
        res =
            max(get_max(1, r1 - pows[k - 1], 1, r2 - pows[k - 1], k - 1), res);
      if (res < min(r1 - pows[k - 1], pows[k - 1] - l2))
        res =
            max(res, get_max(1, r1 - pows[k - 1], l2, pows[k - 1] - 1, k - 1));
      if (res < min(pows[k - 1] - l1, r2 - pows[k - 1]))
        res =
            max(res, get_max(l1, pows[k - 1] - 1, 1, r2 - pows[k - 1], k - 1));
      if (res < min(pows[k - 1] - l1, pows[k - 1] - l2))
        res =
            max(res, get_max(l1, pows[k - 1] - 1, l2, pows[k - 1] - 1, k - 1));
      return res;
    }
    int res = get_max(l1, pows[k - 1] - 1, l2, r2, k - 1);
    if (res < min(r1 - pows[k - 1], r2 - l2 + 1))
      res = max(res, get_max(1, r1 - pows[k - 1], l2, r2, k - 1));
    return res;
  }
  int res = get_max(l1, r1, l2, pows[k - 1] - 1, k - 1);
  if (res < min(r1 - l1 + 1, r2 - pows[k - 1]))
    res = max(res, get_max(l1, r1, 1, r2 - pows[k - 1], k - 1));
  return res;
}
int main() {
  int c = 1;
  for (int i = 0; i < 31; i++) {
    pows[i] = c;
    c *= 2;
  }
  int x, y, z, w;
  scanf("%d%d%d%d\n", &x, &y, &z, &w);
  printf("%d\n", get_max(x, y, z, w, 30));
  return 0;
}
