#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int deal(int l1,int r1,int l2,int r2,int k)//区间长度2^k
{
if(l1>r1||l2>r2) return 0;
if(l1>l2) {swap(l1,l2);swap(r1,r2);}//把第一个区间放左边
if(r2<=r1) return r2-l2+1;//如果第二个区间包含在第一个区间内
if(l1==l2) return r1-l1+1;//第一个区间包含在第二个区间内
int len=1<<k;//k从30开始,保证两个区间变换后左端点一定在左半边
if(l2>len) return deal(l1,r1,l2-len,r2-len,k);//左移
if(r1<len && r2<len ) return deal(l1,r1,l2,r2,k-1);//都在左半边,区间减半
int ans=max(deal(l1,r1,l2,len-1,k),deal(l1,r1,1,r2-len,k));//分治,l1,l2在左半边,r1r2在右半边
return max(r1-l2+1,ans);//最大值要么是重叠的部分,要么是分治之后其中一边的最大值
}
int main()
{
ios::sync_with_stdio(false);
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
cout<<deal(l1,r1,l2,r2,30)<<endl;
}