#include <iostream>
using namespace std;

/**
    node:当前结点
    totalNode:总结点数
    return:编号为node的结点有多少个孩子结点(包括node)
*/
int sum(int node, int totalNode){
    if(totalNode / 2 == node){ //当前结点的下一层就是叶结点了
        if(totalNode % 2 == 0){ //只有左孩子
            return 1 + 1;
        }else{ //左右孩子都有
            return 2 + 1;
        }
    }else if(totalNode / 2 < node){ //倒数第二层,靠右边的叶结点
        return 1;
    }else{ //totalNode / 2 > node 比较上层的结点
        return sum(node * 2, totalNode) + sum(node * 2 + 1, totalNode) + 1;
    }
}

int main() {
    int m,n; //m当前结点, n总结点
    while (scanf("%d %d", &m, &n) != EOF) { // 注意 while 处理多个 case
        if(0 == m && 0 == n){
            break;
        }
        printf("%d\n", sum(m, n));
    }
}
// 64 位输出请用 printf("%lld")