//#include<iostream>
//#include<queue>
//using namespace std;
//
//const int maxn=1e5+5;
//struct point{
// int x;
// int time;
//};
//
//struct point qs[maxn];
//int n,k;
//bool map[maxn];
//
//void find(int s,int t)
//{
//
//}
//
//int main()
//{
// int n,k;
// cin>>n>>k;
// memset(map,true,sizeof(map));
// memset(qs,0,sizeof(qs));
//
// // int cnt=0;
//// if(n==0&&k>n)
//// {
//// n=n+1;
//// cnt++;
//// }
//// int i=n;
//// while(abs(k-i)>=2*i||abs(k-(2*i))<abs(k-i))
//// {
//// i=i*2;
//// cnt++;
//// }
//// cnt+=abs(k-i);
//// cout<<cnt<<endl;
//// return 0;
//
//
//
//}
//
#include<iostream>
#include<queue>
using namespace std;
struct st
{
int loc;
int t;
};
const int maxn=1e5+5;
queue<st> q;
bool vis[maxn];
int main()
{
int n,k;
cin>>n>>k;
st start{n,0};
q.push(start);
//int steps=0;
vis[n]=true;
while(!q.empty())
{
st tmp=q.front();
if(tmp.loc==k)
{
cout<<tmp.t<<endl;
break;
}
// else if(tmp.loc>k)
// {
// cout<<tmp.t+(tmp.loc-k)<<endl;
// break;
// }
else
{
if(!vis[tmp.loc+1]&&tmp.loc+1<=maxn)
{
st right{tmp.loc+1,tmp.t+1};
q.push(right);
vis[right.loc]=true;
}
if(!vis[tmp.loc-1]&&tmp.loc-1>=0)
{
st left{tmp.loc-1,tmp.t+1};
q.push(left);
vis[left.loc]=true;
}
if(!vis[tmp.loc*2]&&tmp.loc*2<=maxn)
{
st prod2{tmp.loc*2,tmp.t+1};
q.push(prod2);
vis[prod2.loc]=true;
}
q.pop();
}
}
return 0;
}
//------------------------上面是RE代码----------------------
//由&&引发的RE,无限RE,调了很长时间...tnnd
//注意左右边界
//注意&&
//注意bool数组的意义
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct st
{
int loc;
int t;
};
const int maxn=1e5+5;
queue<st> q;
bool vis[maxn];
int main()
{
int n,k;
cin>>n>>k;
st start;
start.loc=n;
start.t=0;
q.push(start);
vis[start.loc]=true;
while(!q.empty())
{
st tmp;
tmp=q.front();
if(tmp.loc==k)
{
cout<<tmp.t<<endl;
break;
}
st node;
if(tmp.loc+1<=maxn&&!vis[tmp.loc+1])
{
node.loc=tmp.loc+1;
node.t=tmp.t+1;
q.push(node);
vis[node.loc]=true;
}
if(tmp.loc-1>=0&&!vis[tmp.loc-1])
{
node.loc=tmp.loc-1;
node.t=tmp.t+1;
q.push(node);
vis[node.loc]=true;
}
if(tmp.loc*2<=maxn&&!vis[tmp.loc*2])
{
node.loc=tmp.loc*2;
node.t=tmp.t+1;
q.push(node);
vis[node.loc]=true;
}
q.pop();
}
return 0;
}