/*
    序列 2 4 4 6 8 8 8 10 12 12 14 
    即每一项都是偶数,而且复制k次,a[i] = b*2^k   b%2 != 0

    列一下,发现有规律
    a[2^k - 1] 是最后一个 2^k
    写一下二进制表示,发现当前段(按k划分段)的总和可用到之前的结果
    定义dp[k]表示a[1]到第k段结束之和
    如dp[1] = a[1]
    dp[2] = a[1] + a[2] + a[3]
    
    dp[k] = a[1] +  + a[2^k - 1]
    这个可以预处理出来

    然后对于一个x,要得到sum[x] 用逐位统计去做
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>

using namespace std;

long long dp[32];

void init()
{
    dp[
1= 2;
    
for(int i = 2; i <= 31 ; i++)
    
{
        dp[i] 
= 2*dp[i-1+ ((1LL<<i-1)+1)*(1LL<<i-1);
    }

}


long long cal(long long x)
{
    
if(x==0)return 0;
    
int k = 0 ;
    
while( (1LL<<k) <= x ) k++;
    
long long k2 = 1LL<<k;

    
if(k2-<= k)//在最后k个数中
    {
        
return dp[k] - (k2-1-x)*k2;
    }


    
return dp[k-1]+(x-k2/2 + 1)*(k2/2+ cal(x-k2/2+1);
}


int main()
{
    init();
    
long long x, y;
    
while~scanf("%lld %lld",&x,&y) )
    
{
        printf(
"%lld\n",cal(y)- cal(x-1));
    }
    
    
return 0;
}