unittest
{
	assert( [ "2 4" ].solve == 5 );
	assert( [ "123 456" ].solve == 435 );
	assert( [ "123456789012 123456789012" ].solve == 123456789012 );
	
	assert( [ "0 1000000000000" ].solve == 1000000000000 );		// 追加ケース
	assert( [ "2 1000000000000" ].solve == 1000000000001 );		// 追加ケース
}



import std.conv;
import std.format;
import std.range;
import std.stdio;

void main()
{
	stdin.byLineCopy.solve.writeln;
}

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto a = 0L;
	auto b = 0L;
	input.front.formattedRead!"%s %s"( a, b );
	b++;
	
	auto aa = 0L;
	for( auto x = 1L; x <= a; x <<= 1 )
	{
		auto y = x << 1;		// ビットパターンの周期
		auto r = a % y;
		auto c = ( a / y * x );			// 1周期でビットが立つ回数
		if( x <= r ) c += r - x;		// 最終週でビットが立つ回数
		if( c % 2 ) aa |= x;
	}
	
	auto bb = 0L;
	for( auto x = 1L; x <= b; x <<= 1 )
	{
		auto y = x << 1;		// ビットパターンの周期
		auto r = b % y;
		auto c = ( b / y * x );			// 1周期でビットが立つ回数
		if( x <= r ) c += r - x;		// 最終週でビットが立つ回数
		if( c % 2 ) bb |= x;
	}
	
	return aa ^ bb;
}
