#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DEBUG_OUTPUT_ENABLED 1
	#define DBG(X) dout << #X << "=" << (X) << '\n';
	#define SAY(X) dout << (X) << '\n';
#else
	#define DEBUG_OUTPUT_ENABLED 0
	#define DBG(X) 42;
	#define SAY(X) 42;
#endif

#define dout   ___debug::instance

using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const set<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const map<T, S>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const multiset<T>& v) { for(auto el: v) cout << el << " "; return os; }
namespace ___debug {
	struct DebugStream {
		private:
			bool is_first;
		public:
			DebugStream(bool _is_first): is_first(_is_first) {}
			template<typename T> DebugStream operator<<(const T& value) const {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				cout << value;
				return DebugStream(false);
			};

			template<typename T> DebugStream printArray(T* l, T* r) {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				while(l != r) {
					cout << (*l);
					++l;
					if(l == r) {
						cout << '\n';
					} else {
						cout << ' ';
					}
				}
				return DebugStream(false);
			}
	};
	DebugStream instance(true);
};

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }
void SortUniq(vector<pll>& v) {
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());
}
ll Intersect(ll l1, ll r1, ll l2, ll r2) {
	ll l = max(l1, l2), r = min(r1, r2);
	return max(0LL, r - l + 1);
}
ll Intersect(const pll& a, const pll& b) {
	return Intersect(a.first, a.second, b.first, b.second);
}
int Align(const pll& a, const pll& b) {
	return (a.second + 1 == b.first || b.second + 1 == a.first);
}
const ll BITS = 60;
vector<pll> Rec(ll L, ll R, ll A, ll B) {
	vector<pll> rez;
	if(R < A || B < L) return rez;
	if(A <= L && R <= B) {
		//dout << "@SEGM: " << L << ' ' << R << '\n';
		rez.emplace_back(L, R);
		return rez;
	}
	ll M = (L + R) / 2;
	auto left = Rec(L, M, A, B);
	auto right = Rec(M + 1, R, A, B);
	for(auto& x: left) rez.emplace_back(x);
	for(auto& y: right) rez.emplace_back(y);
	for(auto& x: left) for(auto& y: right) rez.emplace_back(x.first | y.first, x.second | y.second);
	int ch = 1;
	while(ch) {
		ch = 0;
		SortUniq(rez);
		vector<pll> nRez;
		for(int i = 0; i < len(rez);) {
			int j = i;
			pll cur = rez[i];
			while(j < len(rez)) {
				if(Intersect(cur, rez[j]) || Align(cur, rez[j])) {
					cur.first = min(cur.first, rez[j].first);
					cur.second = max(cur.second, rez[j].second);
					++j;
				} else {
					break;
				}
			}
			nRez.emplace_back(cur);
			i = j;
		}
		SortUniq(nRez);
		if(nRez != rez) ch = 1;
		rez = nRez;
	}
	return rez;
}
void solve() {
	ll A = fetch<ll>();
	ll B = fetch<ll>();
	ll answ = 0;
	auto rez = Rec(0, (1LL << BITS) - 1, A, B);
	DBG(rez);
	for(auto& x: rez) answ += x.second - x.first + 1;
	cout << answ << '\n';
}

int main() {
	fast_io();
	solve();

	return 0;
}


Measured memory_bytes: 256