#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <cstring>
#include<iostream>
#include<algorithm>
using namespace std;

// 比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,
// 结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

// 输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。

//对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。
int main() {
    int n, m;
    scanf("%d %d", &m, &n);
    int level_n, level_m;
    int i = 1;
    while (true) { //获得m, n的层数
        if (m > (1 << i - 1) && m < (1 << i)) {
            level_m = i;
        }
        if (n > (1 << i - 1) && n < (1 << i)) {
            level_n = i;
            break;
        }
        i++;
    }
    int left_side = m, right_side = m;
    for (int i = 0; i < level_n - level_m; i++) {
        left_side = left_side * 2;
        right_side = right_side * 2 + 1;
    }
    int NodeNum;
    if (left_side > n) {
        NodeNum = (1 << level_n - level_m) - 1;
    } else if (right_side >= n) {
        NodeNum = (1 << level_n - level_m) - 1;
        NodeNum += n - left_side + 1;
    } else {
        NodeNum = (1 << level_n - level_m + 1) - 1;
    }
    printf("%d\n", NodeNum);
    return 0;
}