#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")