#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;   }   